IT이야기

파일 이름에 선행 0을 추가하는 Linux 쉘 스크립트

cyworld 2021. 5. 3. 21:52
반응형

파일 이름에 선행 0을 추가하는 Linux 쉘 스크립트


약 1,700 개의 파일이있는 폴더가 있습니다. 이름은 모두 1.txt또는 1497.txt등입니다. 모든 파일 이름이 4 자리 숫자가되도록 모든 파일의 이름을 바꾸고 싶습니다.

즉, 23.txt이된다 0023.txt.

이를 수행하는 쉘 스크립트는 무엇입니까? 또는 관련 질문 : grep을 사용하여 \d.txt(예 : 한 자리, 마침표, 문자 txt) 를 포함하는 줄만 일치시키는 방법은 무엇입니까?

지금까지 내가 가진 내용은 다음과 같습니다.

for a in [command i need help with]
do
  mv $a 000$a
done

기본적으로 한 자리, 두 자리 및 세 자리 파일 이름을 찾는 명령을 사용하여 세 번 실행합니다 (초기 0의 수가 변경됨).


시험:

for a in [0-9]*.txt; do
    mv $a `printf %04d.%s ${a%.*} ${a##*.}`
done

[0-9]*.txt필요에 따라 파일 이름 패턴 ( )을 변경합니다 .


초기 파일 이름 집합에 대해 가정하지 않는 범용 열거 이름 변경 :

X=1;
for i in *.txt; do
  mv $i $(printf %04d.%s ${X%.*} ${i##*.})
  let X="$X+1"
done

같은 주제에 대해 :


은 Using rename( prename때로는 펄과 함께 설치되는 경우에) 스크립트를, 당신은 이름 변경을 할 펄 표현을 사용할 수 있습니다. 이름 충돌이있는 경우 스크립트는 이름 바꾸기를 건너 뜁니다.

아래 명령은 ".txt"확장자가 뒤에 오는 4 자리 이하의 파일 만 이름을 바꿉니다. 해당 패턴을 엄격하게 준수하지 않는 파일의 이름은 변경하지 않습니다. 4 자리 이상으로 구성된 이름은 자르지 않습니다.

rename 'unless (/0+[0-9]{4}.txt/) {s/^([0-9]{1,3}\.txt)$/000$1/g;s/0*([0-9]{4}\..*)/$1/}' *

몇 가지 예 :

Original    Becomes
1.txt       0001.txt
02.txt      0002.txt
123.txt     0123.txt
00000.txt   00000.txt
1.23.txt    1.23.txt

지금까지 제공된 다른 답변은 패턴을 따르지 않는 파일의 이름을 바꾸고, 숫자가 아닌 문자를 포함하는 파일 이름에 오류를 생성하고, 이름 충돌을 생성하는 이름 변경을 수행하고, 이름에 공백이있는 파일의 이름을 바꾸려고 시도하고 실패합니다. 아마도 다른 문제.


for a in *.txt; do
  b=$(printf %04d.txt ${a%.txt})
  if [ $a != $b ]; then
    mv $a $b
  fi
done

짧막 한 농담:

ls | awk '/^([0-9]+)\.txt$/ { printf("%s %04d.txt\n", $0, $1) }' | xargs -n2 mv

grep을 사용하여 \ d.txt (IE 1 자리, 마침표, txt 문자)가 포함 된 행만 일치 시키려면 어떻게해야합니까?

grep -E '^[0-9]\.txt$'

폴더에 데이터 유형이 .dat 인 파일이 있다고 가정 해 보겠습니다. 이 코드를 run.sh라는 파일에 복사하고 실행하여 실행 가능하게 만든 chmode +x run.sh다음 다음을 사용하여 실행하십시오 ./run.sh.

#!/bin/bash
num=0
for i in *.dat
do

  a=`printf "%05d" $num`
  mv "$i" "filename_$a.dat"
  let "num = $(($num + 1))"
done

이 폴더에있는 모든 파일을 변환합니다 filename_00000.dat, filename_00001.dat


이 버전은 숫자 앞 (뒤)의 문자열 처리도 지원합니다. 그러나 기본적으로 awk가 지원하는 한 모든 정규식 매칭 + printf를 할 수 있습니다. 그리고 파일 이름에도 공백 문자 (줄 바꿈 제외)를 지원합니다.

for f in *.txt ;do
    mv "$f" "$( 
        awk -v f="$f" '{
            if ( match(f, /^([a-zA-Z_-]*)([0-9]+)(\..+)/, a)) {
                printf("%s%04d%s", a[1], a[2], a[3])
            } else {
                print(f)
            }
        }' <<<''
    )"
done

한 자리 텍스트 파일 만 일치 시키려면 다음을 수행 할 수 있습니다.

$ ls | grep '[0-9]\.txt'

한 줄짜리 힌트 :

while [ -f ./result/result`printf "%03d" $a`.txt ]; do a=$((a+1));done
RESULT=result/result`printf "%03d" $a`.txt

공백이있는 파일 이름이있는 경우에도 정확하도록 신중하게 작성된 솔루션을 제공하려면 다음을 수행하십시오.

#!/usr/bin/env bash

pattern='%04d'  # pad with four digits: change this to taste

# enable extglob syntax: +([[:digit:]]) means "one or more digits"
# enable the nullglob flag: If no matches exist, a glob returns nothing (not itself).
shopt -s extglob nullglob

for f in [[:digit:]]*; do               # iterate over filenames that start with digits
  suffix=${f##+([[:digit:]])}           # find the suffix (everything after the last digit)
  number=${f%"$suffix"}                 # find the number (everything before the suffix)
  printf -v new "$pattern" "$number" "$suffix"  # pad the number, then append the suffix
  if [[ $f != "$new" ]]; then                   # if the result differs from the old name
    mv -- "$f" "$new"                           # ...then rename the file.
  fi
done

ReferenceURL : https://stackoverflow.com/questions/3672301/linux-shell-script-to-add-leading-zeros-to-file-names

반응형