여러 파일이 포함된 100개의 폴더("Folder_1", "Folder_2", "Folder_3"...)가 있습니다. 각 폴더의 루프에서 명령을 실행하고 싶습니다(즉, 조건(즉, 폴더의 파일 수가 20133과 같지 않습니다.) 이것은 내 코드입니다.
for f in *Folder*/; do cd "$f"; if ["$(find . -type f | wc -l)" -ne 20133]; then echo "$f" && cd ..; fi; done
그러나 다음과 같은 오류 메시지가 나타납니다.
-bash: cd: Folder_1/: No such file or directory
-bash: [20133: command not found
...
답변1
문제는 항상 현재 디렉터리( cd "$f"
)를 입력하는데, ( )를 누르면 하나의 디렉터리만 반환된다는 점 입니다 then echo "$f" && cd ..
.
이것이 테스트 환경을 만들고 실제 예제를 작성하기 위해 수행한 작업입니다.
johan@iMac:~$ mkdir -p example/Folder_{1..20}
johan@iMac:~$ touch example/Folder_{1..20}/file_{1..10}
johan@iMac:~$ touch example/Folder_{18..20}/file_{11..15}
johan@iMac:~$ cd example
johan@iMac:~/example$ for f in Folder_*; do test "$(find "$f" -type f | wc -l)" -eq 15 && echo "$f"; done
Folder_18
Folder_19
Folder_20
johan@iMac:~/example$ cd ..
johan@iMac:~$ rm -rf example/
test
가독성을 높이기 위해 [...] 구문 대신 내장 구문을 사용하고 있습니다 . 흥미로운 점은 [
그 캐릭터가 단지 프로그램일 뿐이고, 프로그램과 똑같다는 점이다 test
. 이것이 바로 매개변수 주위에 공백이 필요한 이유입니다 :)
여기에서 확인해 보세요(내 iMac에서).
johan@iMac:~$ md5 /bin/test
MD5 (/bin/test) = 2c4b51263409bd39f1ea0fa4f925130a
johan@iMac:~$ md5 /bin/[
MD5 (/bin/[) = 2c4b51263409bd39f1ea0fa4f925130a