다음 점검을 할 수 없습니다
for file in `ls -R .`
do
if [-f $file] ......
문제는 file.gz
( gzip
압축 파일)이 발견되고 작동하지 않을 때 이 검사가 일치하도록 하려는 것입니다.
답변1
"작동하지 않는다"는 뜻을 구체적으로 명시하시면 더 나은 도움을 드릴 수 있습니다.
어쨌든, "[-f command not find"라는 출력이 나오면 [와 내부 사이에 공백을 넣어야 합니다( /usr/bin/[
모든 기능을 갖춘 명령이 되려면).
if [ -f $file ] ...
그러나 파일에 공백이나 기타 이상한 문자가 포함될 수 있으므로 최소한 "$file" 주위에 따옴표를 붙이는 것이 좋습니다.
if [ -f "$file" ] ...
더 나은 방법은 ls -R .
구문 분석 대신 다음을 사용하는 것입니다.find .
답변2
ls
출력을 구문 분석하고 싶지 않습니다 . 폴더 아래의 모든 파일 목록을 원하고 각 결과에 대해 작업을 수행하려면 .gz
GNU, Solaris 11 또는 일부 BSD 시스템에서와 같이 and 조건자를 사용하고 지원하면 여기에 더 많은 정보가 있습니다.bash
zsh
find
-iname
-print0
while IFS= read -r -d $'\0' file; do
echo "found a .gz: $file"
done < <(find . -type f -iname "*.gz" -print0)
답변3
세 가지 질문이 있습니다.
질문 하나는[ … ]
내장 주변에 공간이 있어야 합니다 ..
[ -f $file ]
또 다른 문제는 출력이 ls -R
쓸모없다는 것입니다. ls -R
디렉토리 부분 없이 파일 이름을 표시하므로 출력을 상대적으로 많이 구문 분석하지 않으면 사용할 수 없습니다. 디렉토리를 재귀적으로 탐색하는 올바른 도구는 다음과 같습니다.find
, 구문이 다릅니다.
세 번째 문제는 변수 대체에 큰따옴표가 없다는 것입니다. 공백 \[*?
이나 .변수 및 명령 대체에는 항상 큰따옴표를 사용하십시오.: "$file"
, "$(mycommand)"
. 자세한 내용은 다음을 참조하세요.공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
find . -exec sh -c '
if [ "$0" ] …
' {} \;
이를 사용하여 find -type f
일반 파일에서 명령을 실행(또는 출력 인쇄)하거나 (Linux에서) find -xtype f
일반 파일에 대한 심볼릭 링크를 포함할 수도 있습니다.
답변4
find
다음과 같은 명령을 사용할 수 있습니다 .
for file in $(find . -type f -iname "*.gz")
do
#now if is not needed
...
done
이렇게 하면 루프 내에서 파일을 테스트하지 않아도 됩니다.