이 파일들을 폴더에 넣었습니다.
1658286488_2022_07_21_15.1.2-ee_gitlab_backup.tar
1658546417_2022_07_22_15.1.2-ee_gitlab_backup.tar
2258286417_2022_07_23_15.1.2-ee_gitlab_backup.tar
나는 그들의 이름을 다음과 같이 표준화하고 싶습니다.
2022-07-21_15.1.2-ee_gitlab_backup.tar
2022-07-22_15.1.2-ee_gitlab_backup.tar
2022-07-23_15.1.2-ee_gitlab_backup.tar
저는 복잡한 bash 스크립트를 사용하는 것을 별로 좋아하지 않기 때문에 mv, rename 또는 이와 유사한 간단한 명령을 찾고 있습니다.
답변1
이미 사용을 시도했으므로 rename
작동하는 솔루션은 다음과 같습니다 rename
(이 유틸리티의 Perl 버전은 p5-File-Rename
일부 시스템에서 패키지의 일부입니다).
rename -n -v -d 's/.*?_// && s/_/-/ && s/_/-/' *-ee_gitlab_backup.tar
위 명령은 세 가지 대체를 사용합니다.
_
첫 번째 교체는 파일 이름의 첫 번째 문자까지 모든 것을 제거합니다. Perl 정규 표현식은.*?_
파일 이름의 시작부터 첫 번째 밑줄까지 모든 항목과 일치합니다.- 두 번째 대체
_
는 수정된 파일 이름의 첫 번째 문자를-
. - 세 번째 대체는 두 번째 대체의 반복입니다. 즉, 다음
_
문자도 로 변경됩니다-
.
이 명령은 해당 옵션으로 호출되므로 아무 작업도 수행하지 않으므로 -n
올바른 작업을 수행한다고 확신하는 경우 제거하십시오.
-d
다른 디렉터리에 있는 파일의 전체 경로를 제공하는 경우 이 옵션을 사용하면 경로의 파일 이름 부분만 이름이 바뀌게 됩니다. 이 -v
옵션을 사용하면 세부적인 작업이 가능합니다.
파일 이름의 첫 번째 부분(예:당신의 댓글 중 하나) 그런 다음 첫 번째 대체 항목을 제거하십시오.
rename -n -v -d 's/_/-/ && s/_/-/' *-ee_gitlab_backup.tar
답변2
사용sed
$ sed -E 's/^[^_]*_(.*\.tar)/mv & \1/' <(find /path/to/dir -type f -name '*.tar' -printf '%f\n')
mv 1658286488_2022_07_21_15.1.2-ee_gitlab_backup.tar 2022_07_21_15.1.2-ee_gitlab_backup.tar
mv 1658546417_2022_07_22_15.1.2-ee_gitlab_backup.tar 2022_07_22_15.1.2-ee_gitlab_backup.tar
mv 2258286417_2022_07_23_15.1.2-ee_gitlab_backup.tar 2022_07_23_15.1.2-ee_gitlab_backup.tar
테스트 실행 중에 이름 변경이 올바른 것으로 보이면 변경 사항을 커밋하고 명령을 실행할 수 있습니다.
$ sed -E 's/^[^_]*_(.*\.tar)/mv & \1/e' <(find /path/to/dir -type f -name '*.tar' -printf '%f\n')