こんにちは、Bashスクリプトを作成する際にいくつかの問題があります。 7000の画像ファイル(dicom)があります。これらのファイルは一緒に属し、順番にディレクトリに配置する必要があります。ただし、これらのファイルを生成するプログラムは、2048ファイルごとに新しいサブフォルダを開いて再起動するようです。このサブフォルダのイメージ名を変更したいと思います。
2048枚の画像(IM_0001〜IM_2048)を含むフォルダがあるとします。 900個の画像を含むフォローアップフォルダがあります。 (IM_0001からIM_0900に再度名前が付けられています)
私の考えでは:
- Forループは、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_とピリオドがフィールド区切り文字として使用されます。