모든 하위 디렉터리에서 특정 확장자를 가진 모든 파일의 이름을 바꿉니다.

모든 하위 디렉터리에서 특정 확장자를 가진 모든 파일의 이름을 바꿉니다.

나는 많은 디렉토리를 가지고 있습니다. 이들 각각에는 특정 확장자를 가진 파일이 있습니다 .ext.

이 파일의 이름을 바꾸고 싶습니다.

예:

// Note: The names are random, can have spaces and special characters

Parent
 |
 |- First Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
 |
 |- Second Directory
 |   |
 |   |- Some file.txt
 |   |- Another one.pdf
 |   `- The one to rename.ext
[…]

.ext모든 확장자를 으로 변경하고 싶습니다 new name.ext2. 디렉토리당 하나의 파일만 있으므로 .ext문제가 없습니다.

지금까지 내가 한 일은 다음과 같습니다.

find ./Parent -name "*.ext" -exec mv "{}" "{}.ext2" \;

나는 그것들을 잔뜩 가지고 The one to rename.ext.ext2있는데 이름을 바꾸는 데 막혔습니다 new name.ext2. 이를 의 두 번째 인수로 설정하면 해당 파일이 디렉터리 mv로 이동되므로 함수를 호출할 때마다 이전에 이동한 파일을 덮어쓰게 됩니다.Parentmv

참고: 매개변수를 사용하여 작동하게 할 수 없습니다 -exec bash -c ''. 나는 다음을 시도했다:

find ./Parent -name "*.ext" -exec bash -c 'mv {} "$(dirname {})/new name.ext2"' \;

$()하지만 이전에는 확장 문제가 있었습니다.{}

답변1

-printf함수를 사용하여 find명령을 구성 할 수 있습니다 .

find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext"
mv /tmp/foo.ext /tmp/new_name.ext

명령 을 다음과 같이 묶으면 $():

$(find /tmp -name "*.ext" -printf "mv %p %h/new_name.ext")
find /tmp -name "*.ext"
/tmp/new_name.ext

고쳐 쓰다:

위 명령은 여러 파일을 올바르게 처리하지 못하며 인용된 값을 사용하지 않습니다. 대신 다음 명령을 사용하십시오.

find /tmp -name \*.ext\*
/tmp/dir with space/bar.ext
/tmp/foo.ext

bash -x < <(find /tmp -name "*.ext" -printf "mv \"%p\" \"%h/new_name.ext2\"\n")
+ mv '/tmp/dir with space/bar.ext' '/tmp/dir with space/new_name.ext2'
+ mv /tmp/foo.ext /tmp/new_name.ext2

find /tmp -name \*.ext\*
/tmp/dir with space/new_name.ext2
/tmp/new_name.ext2

답변2

사용sed

for file in */*.ext; do
    ext2=`echo $file | sed 's/.ext/.ext2/'`
    mv $file $ext2
done

관련 정보