파일 이름을 변수로 사용하여 이름 패턴으로 지정하는 명령이 있습니다.file_*_123.txt
Script.sh file_*_123.txt
이제 일치하는 패턴이 있는 파일이 여러 개 있는 경우 첫 번째 파일에 대해서만 실행되므로 이름 패턴과 일치하는 모든 파일에 대해 이 스크립트가 실행되기를 원합니다. 예를 들어
file_1_123.txt, file_2_123.txt, file_3_123.txt
일종의 for 루프입니다. 그러나 파일 수가 1개 이상일 수 있으므로 반복 방법을 잘 모르겠습니다.
누구든지 해결책을 제안할 수 있나요?
답변1
여기에는 루프에서 스크립트를 호출하거나 스크립트가 명령줄 인수를 반복하도록 배열하는 작업이 포함됩니다.
첫 번째 옵션:
for filename in file_*_123.txt; do
./Script.sh "$filename"
done
그러면 패턴과 일치하는 각 파일에 대해 한 번씩 스크립트가 호출됩니다 file_*_123.txt
.
두 번째 옵션:
스크립트를 수정하고 본문을 루프로 래핑할 수 있습니다.
#!/bin/sh
for filename do
# here you do whatever you need to do with "$filename"
done
또는,
#!/bin/sh
for filename in "$@"; do
# here you do whatever you need to do with "$filename"
done
(루프의 두 변형은 동일합니다)
이로 인해 스크립트가 명령줄 인수를 반복하게 됩니다. 그런 다음 질문에 표시된 대로 스크립트를 실행합니다.
./Script.sh file_*_123.txt
답변2
일치하는 파일을 병렬로 실행하려면 유틸리티 사용을 고려할 수 있습니다.평행선
코드 예
funcXXXX(){
file_path="${1}"
/PATH/Script.sh "${file_path}"
}
# make function funcXXXX can be used by parallel
export -f funcXXXX
ls /PATH/file_*_123.txt | xargs -l | parallel -k -j 0 funcXXXX