スクリプトを使用したテキストファイルの名前変更

スクリプトを使用したテキストファイルの名前変更

フォルダには何千ものテキストファイルがあり、特定の方法で名前が付けられます。

たとえば、

Image_234_Data_7778_n0.txt
Image_234_Data_7778_n1.txt
Image_234_Data_7778_n2.txt

Image_954_Data_4478_n0.txt
Image_954_Data_4478_n1.txt
Image_954_Data_4478_n2.txt

Image_104_Data_9878_n0.txt
Image_104_Data_9878_n1.txt
Image_104_Data_9878_n2.txt

など...

内容が次のようなソースファイル(ファイル名を変更して「何が何であるか」を追跡するために使用されます)を作成したいと思います。

1_1.txt:Image_234_Data_7778_n0.txt
1_2.txt:Image_234_Data_7778_n1.txt
1_3.txt:Image_234_Data_7778_n2.txt

2_1.txt:Image_954_Data_4478_n0.txt
2_2.txt:Image_954_Data_4478_n1.txt
2_3.txt:Image_954_Data_4478_n2.txt

3_1.txt:Image_104_Data_9878_n0.txt
3_2.txt:Image_104_Data_9878_n1.txt
3_3.txt:Image_104_Data_9878_n2.txt

など...

誰もが私のためにこれを行うコードを書くのに役立ちますか?

ベストアンサー1

私はあなたのファイル名が数字で終わらず、一連の数字であるランダムなテキストXXXXNNN.txt形式であり、同じXXXにグループ化したいとします。XXXXNNN

戦略:アルファベット順にファイルを繰り返し、XXXXセクションが変更された時期を検出します。各グループに新しい名前を生成します。 1つのマイナーな問題は、NNN部分が可変幅の場合、アルファベット順にソートされないことです。 NNN=10 は NNN=1 と NNN=2 の間に表示されます。

current=
numbers=
i=0
for x in *.txt ''; do
  stem=${x%.*}
  n=${stem##*[!0-9]}
  stem=${stem%$n}
  if [ "$stem" != "$current" ]; then
    for k in $(printf '%s\n' $numbers | sort -n); do
      y=${i}_${k}.txt
      echo mv "$current$k.txt" "$y"
    done
    current=$stem
    numbers=$n
    i=$((i+1))
  else
    numbers="$numbers $n"
  fi
done

ファイル名の変更、ファイルへの情報の書き込みecho mvなど、使用したいコマンドに置き換えます。mvecho …

ファイル名を変更して以前の名前を追跡する代わりに、次のものを使用することをお勧めします。シンボリックリンク元の名前と単純化された名前を使用してファイルにアクセスできます。

おすすめ記事