이미지가 가득한 디렉토리가 있습니다.
image0001.png
image0002.png
image0003.png
...
그리고 하나의 라이너로 이름을 바꾸고 싶습니다 (예 :).
0001.png
0002.png
0003.png
...
어떻게해야합니까?
Bash 또는 기타 POSIX 호환 쉘을 사용하는 경우 :
for f in *.png; do
mv -- "$f" "${f#image}"
done
데비안과 파생어에서 Perl의 rename
는 sed
와 비슷하게 작동합니다 :
rename -v 's/image//' *.png
대신 다음과 같이 작동하는 util-linux
의 rename
도 있습니다.
rename image '' *.png
Zsh Shell에는 zmv
라는 강력한 배치 이름 바꾸기 명령이 있습니다.
먼저 다음과 같이 zmv
명령을 활성화해야합니다 (~/.zshrc
로 이동).
autoload zmv
기본 구문은 zmv PATTERN REPLACEMENT
입니다. 패턴은 쉘 글로브 표현식입니다. 패턴의 일부는 괄호로 묶을 수 있습니다. 대체 텍스트는 $1
, $2
등을 포함하여 패턴에서 N 번째 괄호로 묶은 그룹을 나타냅니다. 예를 들면 다음과 같습니다.
zmv 'image(*.png)' '$1'
또한 패턴에서 와일드 카드 문자와 일치하도록 $1
, $2
등을 자동으로 정의하도록 zsh에 요청할 수 있습니다.
zmv -w 'image*.png' '$1.png'
나는 일반적 으로이 유스 케이스에 Nice and simple mmv ( man page ) 유틸리티를 사용합니다.
$ mmv "image*.png" "#1.png"
당신의 작업을 수행합니다.
대상 패턴의 #1
는 소스 패턴의 와일드 카드와 일치하는 것으로 대체됩니다. 이것은 여러 개의 와일드 카드에서도 작동하며 파일 이름의 일부 순서를 변경하는 데 사용할 수 있습니다. 소문자를 대문자로 변환하는 등 복잡한 작업을 쉽게 수행 할 수도 있습니다.
인용하여 쉘에서 패턴을 보호하십시오.
sed를 사용하여 이름 바꾸기
for i in image*jpg
do
mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done
나는 Perl을 좋아한다.
Perl -nlE '$old=$_; s/image//; qx(mv $old $_)'
파일을 다른 디렉토리로 복사하는 것과 같은 다른 작업에 동일한 패턴을 사용할 수도 있습니다.
Perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'
qmv
의 renameutils
명령은 탭으로 구분 된 두 개의 열이있는 파일 이름 목록을 표시하는 편집기를 엽니 다. 각 행은 파일 이름 중 하나를 표시하며 두 열에서 동일합니다. 오른쪽 열은 파일의 새 이름을 나타냅니다.
변경하려면 오른쪽의 이름을 편집하십시오. 이 예에서 :%s/...
또는 비주얼 블록 모드가 도움이됩니다.
$ qmv *.png
에디터에서 :
image0001.png image0001.png
image0002.png image0002.png
image0003.png image0003.png
~
~
~
~
"/tmp/user/1000/qmvxWyVMs" 3L, 93C
오른쪽 열에서 이름을 편집하십시오.
(시각적 블록 모드를 사용하여 모든 줄에서 image
접두사 제거)
image0001.png 0001.png
image0002.png 0002.png
image0003.png 0003.png
~
~
~
~
:wq
이름 변경 로그 :
image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png
(예 : 우분투 : apt-get install renameutils
)
image * png 파일을 쉽게 선택하고 파일 이름에서 줄 바꿈을 처리 할 필요가 없다고 가정
find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done
안전, 공백, 줄 바꿈, 백 슬래시 등을 처리 할 수 있음 :
find . -name "image*.png" | while IFS= read -r f; do
mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )";
done
쉘 괄호 확장 사용 :
for N in {0001..1000}; do mv "{image,}$N.png"; done
정규식 (Windows, Linux 및 OS X 지원)을 통해 파일/디렉토리의 이름을 안전하게 일괄 변경하기위한 실용적인 크로스 플랫폼 명령 줄 도구 인 brename ( https://github.com/shenwei356/brename ) ).
@ patrickDurusa 말했다 :
Linux에는 다양한 배치 파일 이름 바꾸기 옵션이 있지만 별명으로 인해 나에게 생긴 단점을 보지 못했습니다.
풍모:
find ./ -name "*.html" -exec CMD
와 같은 명령을 실행할 필요가 없습니다.명령:
$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed
find
명령에서 이름을 읽습니다.
find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done
파일에서 이름 읽기
while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist
Windows 및 linux 의 경우이 Perl script 가 수행합니다. 이 경우 :
$ rnm -l 's/^image//' '*.png'
스크립트는 디렉토리 에서 재귀 적으로 실행될 수 있으며 모든 디렉토리에 카운트를 추가 할 수도 있습니다.
$ rnm -r 's/^/$counter./' '/\.png$/'
UTF-8 문자도 Windows와 Linux 모두에서 올바르게 처리됩니다.