파일 이름에 선행 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
'IT이야기' 카테고리의 다른 글
JqGrid에서 텍스트 줄 감싸기 (0) | 2021.09.12 |
---|---|
Fiddler에서 요청의 타임스탬프를 표시하시겠습니까? (0) | 2021.09.12 |
단위 테스트를 테스트하는 클래스의 친구로 만드는 것이 잘못된 이유 (0) | 2021.05.03 |
virtualenv는 어떻게 작동합니까? (0) | 2021.05.03 |
로그인 성공 후 Spring Security가 이전 페이지로 리디렉션 (0) | 2021.05.03 |