표준 도구를 사용하여 대량 폴더의 이름을 바꿔보세요.

표준 도구를 사용하여 대량 폴더의 이름을 바꿔보세요.

여러 폴더의 이름을 일괄 변경하려고 하는데 어떤 이유로 내 방법이 작동하지 않는 것 같습니다. 다음 스크립트를 사용하려고 하는데 아무 작업도 수행되지 않습니다. 저는 프로그래밍이 처음이므로 조언을 주시면 감사하겠습니다. 이것이 내 폴더 이름입니다.

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 답변.

관련 정보