디렉토리에 이름이 . 형식인 파일이 여러 개 있습니다 *.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/' * */*
다음은 rename
Perl 패키지의 이름 바꾸기 유틸리티입니다. 일부 시스템에서는 이라고 불릴 수도 있습니다 prename
.
(안타깝게도 rename
일부 시스템에서는 패키지에서 실행 파일을 설치하기도 합니다 util-linux
.호환되지 않는.)