디렉토리의 각 파일에서 파일 이름의 일부를 삭제하는 Bash 스크립트

디렉토리의 각 파일에서 파일 이름의 일부를 삭제하는 Bash 스크립트

디렉토리에 이름이 . 형식인 파일이 여러 개 있습니다 *.foo.bar. 부분을 제거하여 각 파일의 이름을 바꾸는 bash 스크립트를 작성하고 싶습니다 .foo.

예를 들어 tree ~/dir/반품을 가정해 보겠습니다.

/home/user/dir/
|- george.foo.bar
|- john.foo.bar
|- paul.foo.bar
|- ringo.foo.bar
|- subdir
   |- jimmy.foo.bar
   |- robert.foo

그런 다음 실행하면 script ~/foo/내용이 ~/foo다음으로 변경됩니다.

/home/user/dir/
|- george.bar
|- john.bar
|- paul.bar
|- ringo.bar
|- subdir
   |- jimmy.bar
   |- robert.foo

답변1

매개변수 확장 메커니즘을 사용할 수 있습니다.

shopt -s globstar
for file in **/*foo.bar; do
    prefix="${file%.foo*}"
    suffix="${file##*.foo}"
    mv -v -- "$file" "$prefix$suffix"
done

일치하는 접미사를 제거하고 ${file%.foo*}(접두사만 남김) ${file#*.foo}접두사를 제거합니다(접미사만 남김). 모든 하위 디렉터리를 순회하고 glob을 허용하려면 **이중 별 glob()이 필요합니다 .setopt -s globstar

답변2

현재 디렉터리와 하위 디렉터리의 모든 파일 이름을 다음으로 바꾸려면 .foo.bar:.bar

rename 's/\.foo\.bar/\.bar/'  * */*

다음은 renamePerl 패키지의 이름 바꾸기 유틸리티입니다. 일부 시스템에서는 이라고 불릴 수도 있습니다 prename.

(안타깝게도 rename일부 시스템에서는 패키지에서 실행 파일을 설치하기도 합니다 util-linux.호환되지 않는.)

관련 정보