조건에서 오류가 발생하는 경우

조건에서 오류가 발생하는 경우

Bash 코딩에서 line3은 xyz/symlinks_paths.txt에서 가져온 경로입니다.

while read -r line3
do
    if [[ $(ls -lh $line3 | grep zzz.exe | grep '[8-9][0-9][0-9][MG]') -ne 0 ]] 
    then 
        echo $line3 >> xyz/size_list.txt
        exit 1
    fi
done < xyz/symlinks_paths.txt

스크립트에서 다음 오류가 발생합니다. (h.sh는 스크립트 이름입니다.)

h.sh: line 20: [[: -r--r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt: syntax error in expression (error token is "r--r-- 1 syncmgr GX 838M Dec  1 21:55 zzz.txt")

답변1

여기서 문제는 구문 분석을 시도하고 있다는 것입니다 ls.언제나나쁜 생각입니다. 바라보다왜 `ls`를 구문 분석하지 *않나요*?왜 이런 일이 발생하는지 설명하십시오.

파일 크기를 원하면 stat.

minsize=$(( 800 * 1024 * 1024 ))

# alternatively, if you have `numfmt` from GNU coreutils, delete the line above
# and uncomment the following line:
#minsize=$(echo 800M | numfmt --from=iec)

while read -r line3 ; do
  if [ "$(stat -L --printf '%s' "$line3")" -gt "$minsize" ]; then
    echo "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

참고: 파일 이름을 입력하면 나열된 파일 이름이 기호 링크일 가능성이 높기 때문에 위에서 stat' -L(일명 ) 옵션을 사용했습니다 . --dereference그렇지 않은 경우 -L심볼릭 stat링크를 따르지 않고 심볼릭 링크 자체의 크기를 인쇄합니다.


파일 이름과 함께 파일 크기를 출력 파일에 인쇄하려는 경우 루프는 while다음과 같습니다.

while read -r line3 ; do
  fsize=$(stat -L --printf '%s' "$line3")

  if [ "$fsize" -gt "$minsize" ]; then
    fsize=$(echo "$fsize" | numfmt --to=iec)
    printf "%s\t%s\n" "$fsize" "$line3" >>  xyz/size_list.txt
  fi
done < xyz/symlinks_paths.txt

답변2

find이는 ( 및 ) 를 사용하여 수행할 수 있지만 xargs미인 대회에서 우승할 수는 없습니다.

다음과 같은 스크립트를 작성하세요 check_files.

#!/bin/sh
find "$@" -size +800M –print

그런 다음 실행

xargs -d '\n' < xyz/symlinks_paths.txt ./check_files

어디

  • < xyz/symlinks_paths.txt리디렉션을 명령줄의 끝( 에서와 같이) xargs -d '\n' ./check_files < xyz/symlinks_paths.txt이나 시작 부분 또는 다른 곳으로 이동할 수 있습니다 . 또는 로 대체할 수 있습니다 . 둘 중 하나는 에서 읽혀진다는 -a xyz/symlinks_paths.txt의미입니다 .xargsxyz/symlinks_paths.txt
  • 스크립트의 절대 경로 이름 ./check_files 으로 바꿀 수 있습니다 .check_files

-d '\n'읽을 때 개행 문자를 구분 기호로 사용함을 나타냅니다 xyz/symlinks_paths.txt. 파일 이름에 공백(공백 또는 탭), 따옴표(작은 따옴표( ')는 아포스트로피와 동일한 문자라는 점을 기억하세요) 또는 백슬래시가 포함되어 있지 않으면 그대로 두면 연봉 베팅을 할 수 있습니다. 그들은 결코 만들지 않을 것입니다.

이는 파일의 각 줄을 읽고 이를 스크립트에 대한 인수로 사용하여 스크립트 check_files에 전달합니다.find ~처럼초기점논쟁. 많은 사람들이 find 여러 개를 실행할 수 있다는 것을 알고 있습니다.초기점예를 들어, 인수;

찾다dir 1 dir 2 dir 3   검색 표현

우리 모두 알고 있듯이 이러한 매개변수는 반드시 디렉토리일 필요는 없습니다. 예를 들어,

찾다파일 1 파일 2 파일 3   검색식

(또는 디렉토리와 파일의 혼합).  find그냥 적용됩니다표현하다 이름이 a인 각 파일은초기점.

따라서 나열된 이름을 가진 모든 파일을 확인하여 xyz/symlinks_paths.txt 크기가 800M 이상인지 확인하고 해당 파일을 인쇄합니다.

파일 이름이 심볼릭 링크(이름에서 알 수 있듯이 xyz/symlinks_paths.txt)를 참조할 수 있고 그것이 가리키는 파일을 보려면(확실히 그렇게 될 것임) find로 변경하십시오 find -L.

별도의 스크립트가 필요하지 않습니다 check_files.

xargs -d '\n' < paths.txt sh -c 'find "$@" -size +800c -print' sh

필요한 경우 find다시 로 변경하세요.find -L

관련 정보