많은 파일이 포함된 디렉토리가 있습니다. 파일 이름은 "Var1_X_Var2_Y_Var3_Z_data_N.txt" 시스템에 따라 지정됩니다. 여기서 X, Y 및 Z는 다양한 숫자이고 N 범위는 1~30입니다.
다음 스크립트에서 이 파일을 사용하려면 1부터 9까지 N이 있는 파일에 앞에 0을 추가해야 합니다.
내 우분투 컴퓨터에서는 다음 명령을 사용합니다.
rename 's/_1.txt/_01.txt/' *
1부터 9까지 반복하세요.
하지만 이 명령은 내가 사용 중인 클러스터에서 작동하지 않습니다. Unix, bash 또는 Python 대안이 필요합니다.
(참고: stackexchange에 관련 질문이 많은 것으로 알고 있는데, 모두 모든 파일이 동일한 트렁크를 공유하는 상황을 이용하는 것 같습니다. 이러한 솔루션을 적용하려고 여러 파일을 파기했습니다.)
답변1
0으로 채워진 두 자리 정수를 입력하려고 N
합니다 .Var1_X_Var2_Y_Var3_Z_data_N.txt
영향을 받는 모든 파일이 다음 패턴과 일치한다고 가정합니다 *_[0-9].txt
.
for name in *_[0-9].txt; do
stem="${name%.txt}" # remove the ".txt" suffix
num=${stem##*_} # extract the number at the end
newname="${stem%[0-9]}$( printf '%02d.txt' "$num" )" # put it back together
printf 'Would rename "%s" into "%s"\n' "$name" "$newname"
# mv -- "$name" "$newname"
done
${name%.txt}
원본 파일 이름 끝에 있는.txt
.$name
이것은 "줄기"를 생성합니다.진짜끝에는 여전히 숫자가 있기 때문입니다.${stem##*_}
다음을 포함한 모든 항목을 삭제합니다.마지막에 밑줄을 긋습니다$stem
.${stem%[0-9]}
는 끝에 숫자가 없는 어간입니다(예Var1_X_Var2_Y_Var3_Z_data_
: ).printf '%02d.txt' "$num"
0으로 채워진 두 자리 숫자와$num
그 뒤에 오는 문자열을 생성합니다.txt
.
파일이 포함된 디렉토리가 주어지면
Var1_X_Var2_Y_Var3_Z_data_1.txt Var1_X_Var2_Y_Var3_Z_data_23.txt
Var1_X_Var2_Y_Var3_Z_data_10.txt Var1_X_Var2_Y_Var3_Z_data_24.txt
Var1_X_Var2_Y_Var3_Z_data_11.txt Var1_X_Var2_Y_Var3_Z_data_25.txt
Var1_X_Var2_Y_Var3_Z_data_12.txt Var1_X_Var2_Y_Var3_Z_data_26.txt
Var1_X_Var2_Y_Var3_Z_data_13.txt Var1_X_Var2_Y_Var3_Z_data_27.txt
Var1_X_Var2_Y_Var3_Z_data_14.txt Var1_X_Var2_Y_Var3_Z_data_28.txt
Var1_X_Var2_Y_Var3_Z_data_15.txt Var1_X_Var2_Y_Var3_Z_data_29.txt
Var1_X_Var2_Y_Var3_Z_data_16.txt Var1_X_Var2_Y_Var3_Z_data_3.txt
Var1_X_Var2_Y_Var3_Z_data_17.txt Var1_X_Var2_Y_Var3_Z_data_30.txt
Var1_X_Var2_Y_Var3_Z_data_18.txt Var1_X_Var2_Y_Var3_Z_data_4.txt
Var1_X_Var2_Y_Var3_Z_data_19.txt Var1_X_Var2_Y_Var3_Z_data_5.txt
Var1_X_Var2_Y_Var3_Z_data_2.txt Var1_X_Var2_Y_Var3_Z_data_6.txt
Var1_X_Var2_Y_Var3_Z_data_20.txt Var1_X_Var2_Y_Var3_Z_data_7.txt
Var1_X_Var2_Y_Var3_Z_data_21.txt Var1_X_Var2_Y_Var3_Z_data_8.txt
Var1_X_Var2_Y_Var3_Z_data_22.txt Var1_X_Var2_Y_Var3_Z_data_9.txt
..이 루프는
Would rename "Var1_X_Var2_Y_Var3_Z_data_1.txt" into "Var1_X_Var2_Y_Var3_Z_data_01.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_2.txt" into "Var1_X_Var2_Y_Var3_Z_data_02.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_3.txt" into "Var1_X_Var2_Y_Var3_Z_data_03.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_4.txt" into "Var1_X_Var2_Y_Var3_Z_data_04.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_5.txt" into "Var1_X_Var2_Y_Var3_Z_data_05.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_6.txt" into "Var1_X_Var2_Y_Var3_Z_data_06.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_7.txt" into "Var1_X_Var2_Y_Var3_Z_data_07.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_8.txt" into "Var1_X_Var2_Y_Var3_Z_data_08.txt"
Would rename "Var1_X_Var2_Y_Var3_Z_data_9.txt" into "Var1_X_Var2_Y_Var3_Z_data_09.txt"
mv
실제로 파일 이름을 바꾸려면 루프 끝에서 주석을 제거하십시오.
답변2
find -name "*_[1-9].txt" -exec sh -c 'echo $1 ${1%_*}_0${1##*_}' _ {} \;
$1
찾은 파일로 교체합니다 .${1%_*}
모든 것을 삭제하는 중뒤쪽에마지막 밑줄과 밑줄 자체.- 이것은
_0
단지 밑줄과 0을 인쇄합니다. - 이렇게 하면
${1##*_}
모든 항목이 삭제됩니다.앞으로마지막 밑줄과 밑줄 자체.
파일 이름을 바꾸려면 echo
다음으로 바꾸십시오 .mv
3o 파일을 패키징하는 데 사용했습니다.
touch Var1_${RANDOM}_Var2_${RANDOM}_Var3_${RANDOM}_data_{1..30}.txt