という名前の365個のファイルがあります
MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf
これらのファイルの名前を次のように変更します。
modis1.hdf
modis2.hdf
modis3.hdf
ファイルごとにmv
コマンドを使用して、ファイル名を変更しています。
一度にこれを達成するにはどうすればよいですか?
A2010...
ビットのみに関心があるため、ファイルのあるディレクトリでrename
を使用します。
rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
例:
$ rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)
-n
なしで実行して、実際にファイルの名前を変更します。
次の方法では、bashパラメーター展開を使用しますが、使用する数値文字列の配置に依存するため、ファイル名が正確に指定した形式になっていることに依存します。これは必ずしも最も堅牢な方法ではありません。また、ファイルを含むディレクトリにいる必要があります。
for f in MOD*.hdf; do
num="${f:13:3}"
mv "$f" modis"$((10#$num))".hdf
done
または、ワンライナーとして:
for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done
これにより、要求された方法でファイルが移動します。つまり、MOD11A1.A2010001.h24v06.006.2016025150444.hdf
はmodis1.hdf
になり、MOD11A1.A2010002.h24v06.006.2016025151748.hdf
はmodis2.hdf
などになります。
次のようにrename
コマンドを使用できます。
$ rename -n 's/MOD11A1\.A2010(...)\..*/modis$1.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)
テスト後、-n
を削除して、実際にファイルの名前を変更します。
s/old/new
old
をnew
に置き換えます\.
リテラル.
...
3文字は何でもかまいません(some chars)
some chars
を保存して後で参照するために$1
rename
コマンドのファイル名の最初の部分と一致する単純な正規表現を使用できます。より明示的な表現を使用して、実行するファイルと実行したくないファイルを区別したり、正規表現が多くの文字を吸い込まないようにしたい場合があります。通常、この種の問題を解決するには、多くの柔軟性があります。これは、ではなく、正確にあなたが求めたものを与えないことに注意してください。数値の固定幅を維持します。ファイル名に固定幅の数字を使用することをお勧めします(そうしないと、たとえば、2の前に10が付いた、混乱した方法でソートされます)(そして、 muruの答え それは...)。rename
を使用して、実際に要求した名前を作成する方法がわからないためです。もしそうなら、答えを更新します
Perl rename
はデフォルトの17.10インストールに含まれていない であるため、17.10を実行している場合(または将来の読者の場合は、おそらくそれ以降のバージョン)、
Sudo apt install rename
以下のコードは次のことを行います。
MOD
で始まり.hdf
で終わるすべてのファイルをループしますリスト内の現在のファイルに対してmv
コマンドを実行し、その名前をmodis
に変更します。その後に変数の番号が続き、.hdf
の後に続きます
#!/bin/bash
idx=1
for file in MOD*.hdf
do
echo mv "$file" "modis$((idx++)).hdf"
done
注:上記のスクリプトは、実行する予定のコマンドのみをecho
します。アクションアクションを実行するには、echo mv
行からecho
を削除する必要があります。
サンプル出力:
mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf