"줄기"가 다른 파일 이름의 경우 앞에 0을 추가하도록 디렉터리의 모든 파일 이름을 바꿉니다.

"줄기"가 다른 파일 이름의 경우 앞에 0을 추가하도록 디렉터리의 모든 파일 이름을 바꿉니다.

많은 파일이 포함된 디렉토리가 있습니다. 파일 이름은 "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

관련 정보