정규식을 사용하여 Bash에서 파일 이름 바꾸기

정규식을 사용하여 Bash에서 파일 이름 바꾸기

이라는 파일이 있는데 35554842200284685106000166550020003504201637715423.xml이름을 다음으로 바꾸면 됩니다 42200284685106000166550020003504201637715423.xml(마지막 48자 앞의 모든 항목 제거). 이 간단한 정규식( )은 마지막 48자를 추출할 수 있지만 Bash에서는 작동하도록 .{48}$만들 수 없습니다 .rename

rename이 정규식을 사용하여 이름을 마지막 48자로만 바꾸려면 어떻게 해야 합니까 ?

편집하다:

산출rename --help

[root@ip-000-00-0-000 tmp]# rename --help

Usage:
 rename [options] <expression> <replacement> <file>...

Rename files.

Options:
 -v, --verbose    explain what is being done
 -s, --symlink    act on the target of symlinks
 -n, --no-act     do not make any changes

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see rename(1).

감사해요.

답변1

실제로는 이것이 필요하지 않습니다 rename. 문제를 해결할 수 있습니다.

$ file=35554842200284685106000166550020003504201637715423.xml
$ newname=$(sed -E 's/.*(.{48})/\1/'<<<"$file"); 
$ mv -v "$file" "$newname"
renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'

답변2

이것은 bash 전용입니다폴리비닐알코올매개변수 확장.

file=35554842200284685106000166550020003504201637715423.xml

외부 도구 전용 mv

mv -v "$file" "${file:6}"

산출

renamed '35554842200284685106000166550020003504201637715423.xml' -> '42200284685106000166550020003504201637715423.xml'

마지막 48자를 유지하세요.

mv -v "$file" "${file:(-48)}"

답변3

당신 것 은 rename쓸모 없는 것 같아요 util-linux.

prename정규식을 사용하려면 Perl 기반 변형(정규식이라고도 함)을 설치해야 합니다. 그런 다음:

rename -n 's:^\./\d+(?=\d{44}\.xml\Z)::' ./*.xml

(더 구체적으로 설명하기 위해 48자를 44자리 숫자로 대체했습니다 .xml.)

zsh또는 다음 을 사용할 수도 있습니다 zmv.

autoload zmv
zmv -n '[0-9]##([0-9](#c44).xml)' '$1'

또는

zmv -n '<->.xml~^?(#c48)' '$f[-48,-1]'

( -n실제로 이 작업을 수행하려면 (모의 실행)을 제거하십시오).

이는 충돌을 방지하는 이점도 있습니다(대상 이름이 동일한 두 파일).

를 사용하면 bash다음을 수행할 수 있습니다.

shopt -s extglob nullglob
for f in +([[:digit:]]).xml; do
  ((${#f) <= 48)) || echo mv -i -- "$f" "${f: -48}"
done

답변4

file=35554842200284685106000166550020003504201637715423.xml
rename  "s/"$file"/"${file: -48}"/" *.xml

rename --version:

/usr/bin/rename using File::Rename version 1.10

관련 정보