bash 스크립트에서 찾기 결과를 어떻게 처리 할 수 있습니까?
find
명령을 사용하여 파일 이름 목록을 저장하기 위해 배열을 사용하려고합니다 .
어떤 이유로 학교에서 사용하는 bash에서 어레이가 작동하지 않지만 내 프로그램은 내 랩톱에서 작동합니다.
그래서 다른 방법이 있는지 궁금합니다. 이것이 내가 가진 것입니다.
array = (`find . -name "*.txt"`) #this will store all the .txt files into the array
그런 다음 배열 항목에 액세스하고 cat 명령을 사용하여 모든 파일의 복사본을 만들 수 있습니다.
배열을 사용하지 않고 할 수있는 다른 방법이 있습니까?
다음과 같이 사용할 수 있습니다.
find . -name '*.txt' | while read line; do
echo "Processing file '$line'"
done
예 : 사본 만들기 :
find . -name '*.txt' | while read line; do
echo "Copying '$line' to /tmp"
cp -- "$line" /tmp
done
HTH
Johannes Weiß의 솔루션에 문제가 있었는데, 에코 만 수행하면 전체 파일 목록에서 작동 할 것입니다. 그러나 다음 줄에서 ffmpeg를 실행하려고하면 스크립트는 처음 발견 한 파일 만 처리합니다. 나는 파이프로 인해 IFS 재미있는 사업을 가정했지만 그것을 알아낼 수 없었고 대신 for 루프로 실행했습니다.
for i in $(find . -name '*.mov' );
do
echo "$i"
done
등호 주위에 공백을 두지 마십시오.
ar=($(find . -name "*.txt"))
백틱은 더 이상 사용되지 않으므로 가능하면 사용하지 마십시오. 특히 열악한 글꼴에서 아 포스트 로프와 쉽게 혼동 될 수 있으며 잘 중첩되지 않습니다.
대부분의 경우 -exec, -execdir, -ok 또는 -okdir을 사용하여 찾기 결과를 직접 반복하면 최상의 서비스를받을 수 있습니다.
For 및 while 루프는 파일 이름이나 줄 바꿈 및 탭의 공백에 관해서 제대로 수행하기 어렵습니다.
find ./ -name "*.txt" -exec grep {} ";"
{}는 마스킹이 필요하지 않습니다. 추가 프로세스를 시작하는 find / xargs 조합을 종종 볼 수 있습니다.
find ./ -name "*.txt" | xargs grep {} ";"
나는 starpause가 가장 깨끗한 해결책이라고 생각하지만 경로에 공백이 있으면 실패합니다. 이것은 설정으로 해결 IFS
됩니다. 따라서 정답은 다음과 같습니다.
IFS=$'\n'
for i in $(find . -name '*.mov' );
do
echo "$i"
done
unset IFS
IFS에 대한 동작을 재설정하고에서이 ( $
가) 필요한 이유는 https://unix.stackexchange.com/questions/184863/what-is-the-meaning-of-ifs-n-in-을IFS=$'\n'
참조 하십시오. bash 스크립팅
find . -name '*.txt' | while IFS= read -r FILE; do
echo "Copying $FILE.."
cp "$FILE" /destination
done
참고 URL : https://stackoverflow.com/questions/2087001/how-can-i-process-the-results-of-find-in-a-bash-script
'Program Tip' 카테고리의 다른 글
Android SQLite 삽입 또는 업데이트 (0) | 2020.12.10 |
---|---|
matplotlib Python에서 다른 막대 색상 설정 (0) | 2020.12.10 |
Linux 명령 줄을 사용하여 HTML 이메일을 보내는 방법 (0) | 2020.12.10 |
iPhone 앱에서 UIButton / UILabel '패딩'을 달성하는 방법 (0) | 2020.12.10 |
Linux 명령 줄 호출이 os.system에서해야하는 것을 반환하지 않습니까? (0) | 2020.12.10 |