파일인지 확인하세요 [ -f file ]

파일인지 확인하세요 [ -f file ]

다음 점검을 할 수 없습니다

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출력을 구문 분석하고 싶지 않습니다 . 폴더 아래의 모든 파일 목록을 원하고 각 결과에 대해 작업을 수행하려면 .gzGNU, Solaris 11 또는 일부 BSD 시스템에서와 같이 and 조건자를 사용하고 지원하면 여기에 더 많은 정보가 있습니다.bashzshfind-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

이렇게 하면 루프 내에서 파일을 테스트하지 않아도 됩니다.

관련 정보