이라는 파일이 있는데 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