다음 명명 구조를 사용하여 여러 파일을 반복하려고 합니다. apple_123.txt
, orange_456.txt
,banana_789.txt
숫자와 함께 와일드카드를 사용해 보았지만 와일드카드가 확장되지 않았고 출력은 다음과 같았습니다: apple_*.txt
와일드카드를 인용해 보았지만 아무런 차이가 없습니다.
내 루프:
fruit=(apple, orange, banana)
for f in "${fruit[@]}"
do
echo "mv ${f}_*.txt ${f}_*.out"
done
답변1
큰따옴표(또는 작은따옴표) 내에서는 파일 글로빙이 수행되지 않습니다.
다음과 같이 변경할 수 있습니다.
fruit=(apple orange banana)
for f in "${fruit[@]}"
do
set -- "${f}_"*.txt
mv "$1" "${1%.txt}.out"
done
파일 글로빙은 따옴표 안에서 발생하지 않기 때문에 약간 까다롭습니다. Kusalananda의 제안 덕분에 set
여기서는 내장 함수를 사용하여 파일에 글로빙을 수행하고 이를 위치 인수로 설정합니다. 확장 작업을 수행하는 데 사용합니다. 일치하는 파일이 여러 개 있는 경우 rename
유틸리티나 다른 중첩 루프를 사용하여 모든 파일에서 작동하도록 이 스크립트를 수정할 수 있습니다. 그렇지 않으면 첫 번째 일치하는 파일의 이름만 변경됩니다.
현재 버전에서 파일 .out
이 아직 존재하지 않거나 일치하는 항목이 여러 개인 경우 이 스크립트는 원하는 방식으로 작동하지 않습니다. 확장자만 변경하고 번호는 유지하려는 경우 쉘 매개변수 확장을 사용하여 간단히 제거한 .txt
다음 .out
.
또한 배열 선언에 쉼표를 사용할 필요가 없으며 요소는 공백으로 구분됩니다. 파일 이름에 실제로 쉼표 문자가 포함되어 있지 않는 한.