나는 많은 디렉토리를 가지고 있습니다. 이들 각각에는 특정 확장자를 가진 파일이 있습니다 .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
로 이동되므로 함수를 호출할 때마다 이전에 이동한 파일을 덮어쓰게 됩니다.Parent
mv
참고: 매개변수를 사용하여 작동하게 할 수 없습니다 -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