크기가 1k보다 크고 확장명이 txt인 파일을 가져오려고 하는데 코드는 다음과 같습니다.
files=$(find foldername -size +1k -name \*.txt -exec {} \;)
for item in $files
do
echo $item
done
그런데 아래와 같이 예상치 못한 결과가 나왔습니다. 도와주세요! ! !
DEST/sample - Copy - Copy.txt: line 1: Hello: command not found
DEST/sample - Copy - Copy.txt: line 2: This: command not found
DEST/sample - Copy - Copy.txt: line 3: In: command not found
DEST/sample - Copy - Copy.txt: line 4: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 5: User: command not found
DEST/sample - Copy - Copy.txt: line 6: -s: command not found
DEST/sample - Copy - Copy.txt: line 7: -d: command not found
DEST/sample - Copy - Copy.txt: line 8: -t: command not found
DEST/sample - Copy - Copy.txt: line 9: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 10: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 11: Hello: command not found
DEST/sample - Copy - Copy.txt: line 12: This: command not found
DEST/sample - Copy - Copy.txt: line 13: In: command not found
DEST/sample - Copy - Copy.txt: line 14: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 15: User: command not found
DEST/sample - Copy - Copy.txt: line 16: -s: command not found
DEST/sample - Copy - Copy.txt: line 17: -d: command not found
DEST/sample - Copy - Copy.txt: line 18: -t: command not found
DEST/sample - Copy - Copy.txt: line 19: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 20: Hello: command not found
DEST/sample - Copy - Copy.txt: line 21: This: command not found
DEST/sample - Copy - Copy.txt: line 22: In: command not found
DEST/sample - Copy - Copy.txt: line 23: $'\r': command not found
DEST/sample - Copy - Copy.txt: line 24: User: command not found
DEST/sample - Copy - Copy.txt: line 25: -s: command not found
DEST/sample - Copy - Copy.txt: line 26: -d: command not found
DEST/sample - Copy - Copy.txt: line 27: -t: command not found
DEST/sample - Copy.txt: line 1: Hello: command not found
DEST/sample - Copy.txt: line 2: This: command not found
DEST/sample - Copy.txt: line 3: In: command not found
DEST/sample - Copy.txt: line 4: $'\r': command not found
DEST/sample - Copy.txt: line 5: User: command not found
DEST/sample - Copy.txt: line 6: -s: command not found
DEST/sample - Copy.txt: line 7: -d: command not found
DEST/sample - Copy.txt: line 8: -t: command not found
DEST/sample - Copy.txt: line 9: $'\r': command not found
DEST/sample - Copy.txt: line 10: $'\r': command not found
DEST/sample - Copy.txt: line 11: Hello: command not found
DEST/sample - Copy.txt: line 12: This: command not found
DEST/sample - Copy.txt: line 13: In: command not found
DEST/sample - Copy.txt: line 14: $'\r': command not found
DEST/sample - Copy.txt: line 15: User: command not found
DEST/sample - Copy.txt: line 16: -s: command not found
DEST/sample - Copy.txt: line 17: -d: command not found
DEST/sample - Copy.txt: line 18: -t: command not found
DEST/sample - Copy.txt: line 19: $'\r': command not found
DEST/sample - Copy.txt: line 20: Hello: command not found
DEST/sample - Copy.txt: line 21: This: command not found
DEST/sample - Copy.txt: line 22: In: command not found
DEST/sample - Copy.txt: line 23: $'\r': command not found
DEST/sample - Copy.txt: line 24: User: command not found
DEST/sample - Copy.txt: line 25: -s: command not found
DEST/sample - Copy.txt: line 26: -d: command not found
DEST/sample - Copy.txt: line 27: -t: command not found
답변1
명백한 문제: find 명령은 -exec {}
발견한 모든 파일을 실행하려고 시도하는 하나를 실행하고 있습니다(대부분의 오류 메시지의 소스). 예를 들어 다음과 같은 뜻일 수도 있습니다 -print
.
files=$(find foldername -size +1k -name \*.txt -print)
이름에 공백이 있는 파일을 발견하면 목록에 문제가 발생할 수도 있습니다. 그러나 파일을 올바르게 찾은 후에는 이 문제를 볼 수 있습니다.
이를 수행하는 방법에는 여러 가지가 있습니다. 스크립트를 약간 변경한 방법은 다음과 같습니다.
find foldername -size +1k -name \*.txt -print | \
while IFS= read -r item
do
echo "$item"
done
답변2
-exec
그것이 당신이 원하는 것이라고 가정하십시오 . (이 옵션은 -exec
파일을 읽는 대신 파일을 실행합니다)
find 옵션과 일치하는 파일 이름을 인쇄하는 간단한 솔루션은 다음과 같습니다.
find foldername -size +1k -name \*.txt -print
변수에 이름을 할당해야 한다면 더 많은 이름이 필요합니다. 명령으로 생성된 파일 이름의 공백을 처리할 수 있으려면 find
이 옵션이 -print0
일반적인 솔루션입니다.
find foldername -size +1k -name \*.txt -print0
그러나 결과를 bash 변수로 읽는 것은 쉽지 않습니다.
설명이 길어지네요이 훌륭한 Greg 위키 페이지
#!/bin/bash
unset a
while IFS= read -r -d $'\0' file; do
a+=( "$file" ) # or however you want to process each file
done < <(find foldername -size +1k -name \*.txt -print0)
printf 'filename=%s\n' "${a[@]}"
답변3
를 사용하면 찾은 각 파일을 명령으로 실행하도록 -exec {} \;
지시할 수 있습니다 . find
파일 이름을 인쇄하려는 것 같으므로 다음과 같이 말하십시오: -print
.but파일 이름에 공백이 포함되어 있으면 중단됩니다.. ls
or의 출력을 구문 분석하는 것은 일반적으로 나쁜 생각입니다 find
. 파일 이름에 공백이나 기타 특수 문자가 포함될 가능성이 전혀 없는 경우에만 이 작업을 수행하십시오.
결과에 따라 조치를 취하는 안전한 방법 은 조치를 find
실행하는 것입니다 . find
특정 쉘 구성(다중 명령, 변수 확장, 파이프 등)을 사용해야 하는 경우 if
쉘을 호출하십시오. 파일 이름을 이 셸에 인수로 전달합니다.
find … -exec sh -c '
echo "$0"
' {} \;
각 파일에 대해 하나의 셸을 호출하는 대신 파일 배치에 대해 셸을 호출하면 작업 속도를 높일 수 있습니다.
find … -exec sh -c '
for item do
echo "$item"
done
' sh {} +