하나의 확장자를 가진 모든 파일의 이름을 다른 확장자로 재귀적으로 바꾸는 방법

하나의 확장자를 가진 모든 파일의 이름을 다른 확장자로 재귀적으로 바꾸는 방법

폴더가 있다고 가정해 보겠습니다.

/
/a.bub
/v.bub
/dr.bub
/catpictures
/catpictures/or.bub
/catpictures/on.bub

각각을 .aaa.

잘못된 접근 방식인 것처럼 보이지만 내가 얻은 결과는 다음과 같습니다.

find -type f -name "*.bub" -print0 -exec mv

답변1

가장 쉬운 방법은 bash 자체를 사용하는 것입니다.

for f in *.bub; do mv "$f" "${f/.bub/.aaa}"; done

@ZeroPiraeus와 @HaukeLaging이 올바르게 지적했듯이 이는 재귀적이지 않습니다. 활성화하여 재귀적으로 만들 수 있습니다.globstar옵션:

shopt -s globstar
for f in **/*.bub; do mv "$f" "${f/.bub/.aaa}"; done

이전 버전의 bash의 경우 다음을 사용하십시오 find.

find -type f -name "*.bub" | while read f; do 
  mv "$f" "${f/.bub/.aaa}";
done

답변2

find다음 을 사용할 수 있습니다 xargs.

$ find some_folder -type f -name "*.bub" | 
    sed "s/\.bub$//" | 
    xargs -I% mv -iv %.bub %.aaa
`some_folder/a.bub' -> `some_folder/a.aaa'
`some_folder/v.bub' -> `some_folder/v.aaa'
`some_folder/dr.bub' -> `some_folder/dr.aaa'
`some_folder/catpictures/or.bub' -> `some_folder/catpictures/or.aaa'
`some_folder/catpictures/on.bub' -> `some_folder/catpictures/on.aaa'

...이를 bash 함수로 일반화할 수 있습니다.

$ extmv () {
    find "${1}" -type f -name "*.${2}" | 
    sed "s/\.${2}$//" | 
    xargs -I% mv -iv "%.${2}" "%.${3}"
}

...다음과 같이 사용할 수 있습니다.

$ extmv some_folder/ bub aaa

관련 정보