파일과 하위 디렉터리가 포함된 디렉터리를 구문 분석해야 하는데 find 명령을 사용할 수 없습니다. for 루프는 각 파일을 통과하여 다른 디렉터리와 비교해야 하지만 하위 디렉터리를 통과하도록 할 수는 없습니다.
difference=0
for item in $1
do
if [[ -d $item ]]
then
continue
fi
if [ ! -f "$2/$(basename $item)" ]
then
echo "$2/$(basename $item) is missing"
difference=1
fi
if [ diff $item "$2/$(basename $item)" ]
then
echo "$1/$(basename $item) is different"
difference=1
fi
done
위의 코드를 사용하면 하위 디렉터리를 건너뛰지만 파일도 비교하지 않습니다. 계속해서 첫 번째 if 문을 생략하고 다음을 입력하면 다음을 알 수 있습니다.
for item in $(find $1 -type f)
작동은 되지만 해당 기능을 사용할 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 그리고 이 디렉토리와 비교할 다른 디렉토리가 있는데, 코드가 동일하기 때문에 기록하지 않았습니다.
답변1
이것이 문제에 대한 가장 자연스러운 해결책입니다.
find . -type f -maxdepth 1 | ...
이 기능을 사용할 수 없습니다.
/usr/bin/find 실행을 방해하는 설정 제약 조건을 설명하도록 질문을 업데이트하십시오.
그러나 파일도 비교하지 않습니다.
if [[ -d $item ]]
...
if [ ! -f "$2/$(basename $item)" ]
...
if [ diff $item "$2/$(basename $item)" ]
반복이 좋습니다.
당신이 원하는 마지막 조항은
if diff $item "$2/$(basename $item)"
즉, ( ) 없이 종료 상태를 if
보고자 하는 것입니다 .diff
test
[
다음 두 줄의 차이점을 확인하세요.
if [ diff $item "$2/$(basename $item)" ]
if diff $item "$2/$(basename $item)"
bash에게 몇 가지 샘플 질문을 해보자.
$ if true; then echo Yes; fi
Yes
$ if false; then echo Yes; fi
$ if [ ]; then echo Yes; fi
$ if [ true ]; then echo Yes; fi
Yes
$ if [ false ]; then echo Yes; fi
Yes
$ if [ apple ]; then echo Yes; fi
Yes
[
bash 내장은 /usr/bin/test의 동의어인 /usr/bin/[과 대략 동일합니다 . 또한 여기서는 /usr/bin/true 및 /usr/bin/false를 호출합니다. 1과 0의 종료 상태를 제공합니다. 이 중 네 가지 경우에는 포크하지 않습니다.어느자식 프로세스.
스크립트를 작성할 때 린터가 유용할 수 있습니다 shellcheck
.