여러 폴더의 이름을 일괄 변경하려고 하는데 어떤 이유로 내 방법이 작동하지 않는 것 같습니다. 다음 스크립트를 사용하려고 하는데 아무 작업도 수행되지 않습니다. 저는 프로그래밍이 처음이므로 조언을 주시면 감사하겠습니다. 이것이 내 폴더 이름입니다.
test.custom.tmp untitledfolder.custom.tmp wis.custom.tmp
이름을 다음으로 바꿔야 합니다.
test untitledfolder wis
다음 스크립트를 사용하고 있지만 아무 작업도 수행하지 않습니다.
while read line; do
newname=$(echo "$line" | cut -f 1 -d '_')
mv $line newname;
done < read
여기에서는 이름을 바꿔야 하는 모든 폴더 이름이 포함된 read라는 파일을 만들었습니다.
이 스크립트에 어떤 문제가 있으며 이 작업을 수행하는 더 좋은 방법이 있습니까? 감사해요.
답변1
간단한 방법은 다음과 같습니다.
$ for d in *.custom.tmp/; do
echo mv -- "$d" "${d%%.*}"
done
mv -- test.custom.tmp/ test
mv -- untitledfolder.custom.tmp/ untitledfolder
mv -- wis.custom.tmp/ wis
이것이 원하는 결과라고 확신하면 이를 제거하십시오 echo
.
이것은${d%%.*}
매개변수 확장, 정확하게 말하자면:
${매개변수%단어}
${매개변수%%단어}
단어가 확장되어 패턴을 생성하고 아래 설명된 규칙에 따라 일치됩니다(패턴 일치 참조). 패턴이 매개변수 확장 값의 후행 부분과 일치하는 경우 확장 결과는 가장 짧은 일치 패턴("%" 케이스) 또는 가장 긴 일치 패턴("%%" 케이스)이 있는 매개변수 값이 제거됩니다.
이 경우 문자열을 사용 test.custom.tmp
하고 첫 번째 문자열 이후의 모든 항목을 제거합니다 .
.
답변2
방법을 유지하려면 다음을 수행하십시오.
while read line; do
newname=$(echo "$line" | cut -f 1 -d '.');
mv $line $newname;
done < read
구분 기호는 점( )이며 문자열이 아닌 변수 -d '.'
로도 사용된다는 점을 기억하세요.$newname
이렇게 하면 스크립트 오류가 수정되지만 더 나은 접근 방식을 위해 사용할 수 있습니다.@schrodingerscatcuriosity 답변.