[bash] macOS 터미널에서 파일 이름을 일괄 변경하는 방법은 무엇입니까?
다음과 같은 일련의 파일이있는 폴더가 있습니다.
prefix_1234_567.png
prefix_abcd_efg.png
하나의 밑줄과 중간 내용 을 일괄 제거 하여 출력은 다음과 같습니다.
prefix_567.png
prefix_efg.png
관련성이 있지만 완전히 설명하지는 않음 :
답변
특정 경우에는 다음 bash
명령을 사용할 수 있습니다 ( bash
macOS의 기본 셸).
for f in *.png; do echo mv "$f" "${f/_*_/_}"; done
참고 : 파일 이름이로 시작될 가능성이있는 경우 파일 앞에 -
위치 --
[1] :
mv -- "$f" "${f/_*_/_}"
참고 : echo
연습 mv
실행을 수행하기 위해 앞에 추가됩니다 . 실제 이름 변경을 수행하려면 제거하십시오.
명령 줄에서 실행하거나 스크립트에서 사용할 수 있습니다.
"${f/_*_/_}"
bash
매개 변수 확장 의 응용 프로그램입니다 . (첫 번째) 하위 문자열 일치 패턴_*_
이 literal로 대체되어_
이름에서 중간 토큰을 효과적으로 잘라냅니다.- 참고
_*_
A는 패턴 (로도 글 로빙에 사용되는 와일드 카드 표현)이 아닌 정규 표현식 (실행 패턴에 대한 자세한 내용man bash
및 검색Pattern Matching
).
배치 이름을 자주 바꾸는 파일을 발견하는 경우 Perl 기반 rename
유틸리티 와 같은 특수 도구를 설치하는 것이 좋습니다. macOS 에서는 다음과 같이 인기있는 패키지 관리자 Homebrew 를 사용하여 설치할 수 있습니다 .
brew install rename
다음은 맨 위에있는 명령에 해당하는 것입니다 rename
.
rename -n -e 's/_.*_/_/' *.png
다시 말하지만,이 명령은 드라 이런을 수행합니다. -n
실제 이름 바꾸기를 수행하려면 제거하십시오 .
bash
솔루션과 유사하게s/.../.../
텍스트 대체를 수행하지만 in과는 달리bash
진정한 정규 표현식 이 사용됩니다.
[1] --
대부분의 유틸리티에서 지원하는 특수 인수의 목적은 Jacob C.가 언급했듯이 ,로 시작하는 옵션 처럼 보이 더라도 후속 인수가 피연산자 (값) 로 처리되어야 함을 알리는 것입니다 .-
답변
파일 이름을 바꾸려면 rename
유틸리티를 사용할 수 있습니다 .
brew install rename
예를 들어 현재 디렉토리의 모든 파일 이름에서 검색 문자열을 변경하려면 :
rename -nvs searchword replaceword *
변경 사항을 적용하려면 ‘n’매개 변수를 제거하십시오.
더 많은 정보: man rename
답변
sed를 사용할 수 있습니다.
ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv
결과:
prefix_567.png prefix_efg.png
* 드라 이런을 먼저 수행 mv
하려면 마지막에echo
설명:
- e : 하나의 sed 명령에만 선택 사항입니다.
- p : sed에 입력을 인쇄합니다.이 경우 이름을 변경하기 전에 원래 파일 이름이됩니다.
- @ : sed를 더 읽기 쉽게 만들기 위해 / 문자를 대체합니다. 즉, sed s / search / replace / g를 사용하는 대신 s @ search @ replace @ g를 사용하십시오.
- _. * : 밑줄은 실제 ‘.’를 나타내는 이스케이프 문자입니다. 문자 0 번 이상 (정규식의 모든 문자와 반대)
- -n2 : 매개 변수로 mv에 전달해야하는 2 개의 출력이 있음을 나타냅니다. ls의 각 입력 에 대해이 sed 명령은 2 개의 출력을 생성 한 다음 mv에 제공합니다.
답변
나는 be90-01.png와 같은 파일 배치를 가지고 있었고 대시를 밑줄로 변경해야했습니다. 나는 이것을 잘 사용했다.
for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done
답변
을 rename
사용하여 명령을 설치할 수 있습니다 brew
. 그냥 brew install rename
하고 사용하십시오.
답변
사용 mmv
mmv '*_*_*' '#1_#3' *.png
답변
이 시도
for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done
다른 방법이 있습니다.
for file in Name*.png; do mv "$file" "01_$file"; done