여러 하위 폴더와 파일이 포함된 디렉터리 구조에서 일부 파일 이름에는 접미사 _create
(예: java1_create
)가 있고 일부 파일 이름에는 _bak
( java2_bak
)가 있습니다.
모든 파일에 접미사가 붙도록 _create
파일 이름을 접미사로 변경하기 만 하면 됩니다 ._bak
_bak
이를 수행하는 명령이나 스크립트가 있습니까?
답변1
Linux에서는 _create
파일 이름에 아무 것도 없다고 가정하면(끝에만) rename
모든 비임베디드 Linux 시스템에 설치된 util-linux 패키지의 유틸리티를 사용할 수 있습니다. 호출은 find
하위 디렉터리의 모든 파일에 대해 명령을 반복적으로 실행합니다.
find -depth -exec rename _create _bak {} +
Debian 및 파생 배포판(Ubuntu, Mint 등)에서 Perl 스크립트는 로 제공되거나 , 대신 rename
호출되거나 , 로 대체될 수 있습니다 .rename.ul
rename
rename _create _bak
rename 's/_create$/_bak/'
답변2
이것이 당신이 추구하는 것일 수 있습니다:
for file in $(find . -name "*_create"); do mv -i $file ${file%%_create}_bak; done
실제 파일에 사용하기 전에 반드시 테스트해 보세요.
답변3
Debian, Ubuntu 및 그 파생 제품에서는 Perl이 사용되며 rename
때로는 다음과 같이 설치됩니다 prename
.
#enable ** globbing
shopt -s globstar
#use the rename utility
rename -n 's/_create$/_bak/' **_create
예상대로 작동하면 -n
(=) 플래그를 제거하십시오.--no-act
노트:
이는 아마도 이 작업을 수행하는 가장 짧고 효율적인 방법일 것입니다. 특히 이미 shotp -s globstar
(mine ~/.bashrc
)을 사용하고 있는 경우에는 더욱 그렇습니다.
그러나 다음을 얻을 수 있습니다.
-bash: /usr/bin/rename: Argument list too long
**_create
확장자가 getconf ARG_MAX
문자 길이(Linux 시스템에서는 2097152)를 초과하는 경우 .
find -print0
이 경우 다음 과 함께 사용해야 합니다 xargs -0
(참조lcd047의 답변).