複数のファイル名を変更する、Bashスクリプト(好ましくはaddを使用)

複数のファイル名を変更する、Bashスクリプト(好ましくはaddを使用)

こんにちは、Bashスクリプトを作成する際にいくつかの問題があります。 7000の画像ファイル(dicom)があります。これらのファイルは一緒に属し、順番にディレクトリに配置する必要があります。ただし、これらのファイルを生成するプログラムは、2048ファイルごとに新しいサブフォルダを開いて再起動するようです。このサブフォルダのイメージ名を変更したいと思います。

2048枚の画像(IM_0001〜IM_2048)を含むフォルダがあるとします。 900個の画像を含むフォローアップフォルダがあります。 (IM_0001からIM_0900に再度名前が付けられています)

私の考えでは:

  1. Forループは、2番目のフォルダ内のすべてのファイルを繰り返します。
  2. mv IM_{number} IM_{number+2048} (したがって、IM_0001はIM_2049になります。)

つまり、基本的にすべてです。このタスク(または同様のタスク)を実行する簡単で効率的な方法はありますか?残念ながら、私はBashの構文に慣れていないので、どんな意見でも私たちに感謝します。名前が似ている必要があります!したがって、単に2番目のフォルダ内のすべてのプロジェクトの名前をJM_0001からJM_0900に変更すると、インポートツール(残念ながら作業するにはその特定のツールを使用する必要があります)が混乱します。

ありがとうございます!

答え1

ファイル名に拡張子がない場合:

for i in secondfolder/IM_* ; do mv "$i" "${i%_[0-9]*}_$[10#${i##*_}+2048]" ; done

答え2

簡単な方法bash

for i in $(ls /path/to/your-directory); do
name=$(echo "$i" | cut -d '_' -f1)
num=$(echo "$i" | cut -d'_' -f2)
num1=$(( num + 2048 ))
mv "$i" "${name}_$num1"
done

答え3

これがシェルスクリプトとawkを使ってこれを行う基本的な方法です。

このサンプルスクリプトは、特定のケースに対してかなり明示的であり、ファイル名の2番目のフィールドを有効な整数として使用します。そして、ファイル名に誤った下線がないことを信じてください。より一般的なスクリプトは、フィールド2が数値だけであることを確認し、フィールド区切り文字をパラメータにします。また、ファイル拡張子(例:.imgや.png)がないとします。

#!/bin/sh
WORKDIR=/(名前を変更するファイルがあるディレクトリ)
数量を追加= 2048
CD $WORKDIR
echo "古いファイルの新しいファイル"
ls IM_ * |読んでいる間
する
   newfile=`echo $i | awk -F_ -v incby=$NUM2ADD '{t=$2 + incby;printf "IM_%s",t;}'`
   エコ$ i $新しいファイル
   #テストをドライランした後に結果が確認されたら、「echo」を「mv」に置き換えます。
完璧

ファイル拡張子がある可能性が高いため、awk行を次のように変更できます。

newfile=`echo $i | awk -F[_.] -v incby=$NUM2ADD '{t=$2 + incby; printf "IM_%s.%s",t,$3;}'`

これにより、ファイル拡張子が保持され、underscore_とピリオドがフィールド区切り文字として使用されます。

関連情報