Bash에서 하위 디렉터리 없이 파일 디렉터리를 반복하는 방법

Bash에서 하위 디렉터리 없이 파일 디렉터리를 반복하는 방법

파일과 하위 디렉터리가 포함된 디렉터리를 구문 분석해야 하는데 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보고자 하는 것입니다 .difftest[

다음 두 줄의 차이점을 확인하세요.

     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.

관련 정보