다음 현재 폴더 아래에 파일 예제가 있습니다.
lok.log.1
df.log.6
weq.log.90
vr.log.11
vs.aw.frsd.log.3
파일 확장자를 1씩 늘리고 싶습니다.
따라서 예상 출력은 다음과 같습니다.
lok.log.2
df.log.7
weq.log.91
vr.log.12
vs.aw.frsd.log.4
찾기 및 정규식을 사용하여 파일 이름을 바꾸는 방법을 제안하십시오.
- 개념은 ".log"가 있는 모든 파일의 이름이 +1로 변경된다는 것입니다.
답변1
그리고 zsh
:
autoload zmv # best in ~/.zshrc
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
-n
(결과가 만족스러우면 삭제하세요)
<->
임의의 십진수와 일치합니다.(#qnOn)
n
On
여기서 :glob 한정자는 파일 목록을 이름()별로 역순으로 정렬하므로 이름을 바꾸기 전에 이름file.log.2
을 바꾸세요 .file.log.3
file.log.1
file.log.2
.
정기적인파일(그러나 숨겨진 파일의 이름도 바꾸려면-o-nT
GNU 를 가정하는 옵션을 추가할 수 있습니다mv
).D
-f
비활성화하면 파일 이름이 기존 파일로 바뀔 때 명령에서 보호가 제거되어 위의 예를 방해하게 됩니다file.log.1
.file.log.2
여전히 두 가지 모두로부터 보호하며foo.log.1
이름foo.log.01
은foo.log.2
.
재귀적으로:
zmv -n -f '(**/)(*.log.)(<->)(#qnOn)' '$1$2$(($3+1))'
또는 또는 :bash
sh
ksh
zsh << 'EOF'
autoload zmv
zmv -n -f '(*.log.)(<->)(#qnOn)' '$1$(($2+1))'
EOF
bash
using 사용 여부에 관계없이 GNU 및 GNU가 zsh
있고 파일 목록이 너무 크지 않으면 다음을 수행할 수 있습니다.ls
mv
shopt -s failglob
shopt -s extglob
export LC_ALL=C
eval "files=($(
ls --quoting-style=shell-always -rvd -- *.log.+([[:digit:]])))"
for f in "${files[@]}"; do
echo mv -nT -- "$f" "${f%.*}.$((10#${f##*.} + 1))"
done
(만족하면 제거 echo
).
일반 파일에 대해서만 GNU bash
, GNU find
, GNU mv
및 GNU 를 재귀적으로 사용합니다.sort
export LC_ALL=C
while IFS= read -rd '' -u3 file; do
echo mv -nT "$file" "${file%.*}.$((10#${file##*.} + 1))"
done 3< <(
find . -name '.?*' -prune -o -regex '.*\.log\.[0-9]+' -type f -print0 |
sort -rzV)
mv -n
-T
기존 파일이 손상되는 것을 방지하고 파일 간의 모호성을 제거하기 위한 GNU 확장입니다.이동하다그리고이사 오다그렇지 않으면 mv
영향을 받게 됩니다. 그러나 어떤 이유로 파일 이름이 바뀌지 않으면 -n
관련 오류가 발생하지 않는다는 점에 유의하세요.
답변2
rename
기반 - 산술 사용 허용(일부 배포판에서는 이 이름 바꾸기 도구의 이름을 사용함 perl
):prename
perl
rename 's/(log.)([0-9]+)$/$1.($2+1)/e' <files>
find와 함께 사용하려면 다음을 사용하십시오.
find <search options> -exec rename 's/(log.)([0-9]+)$/$1.($2+1)/e' {} +
Stéphane의 의견을 따라 편집하십시오.
정렬되지 않은 출력은 find
실제로 문제를 일으킬 수 있으므로 미리 정렬하는 것이 좋습니다. 주어진 이름 패턴에 대해 버전 번호 매기기 옵션을 사용하여 역방향(!) 정렬을 사용할 수 있습니다.
find <search parpameters> -print0 |\
sort -rzV |\
xargs -r0 rename 's/(log.)([0-9]+)$/$1.($2+1)/e'