web-dev-qa-db-ja.com

複雑な番号の付いた複数のファイルの名前を変更する

という名前の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コマンドを使用して、ファイル名を変更しています。

一度にこれを達成するにはどうすればよいですか?

6
Vaishali Jain

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なしで実行して、実際にファイルの名前を変更します。

10
muru

次の方法では、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.hdfmodis1.hdfになり、MOD11A1.A2010002.h24v06.006.2016025151748.hdfmodis2.hdfなどになります。

6
Arronical

次のように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/newoldnewに置き換えます
  • \.リテラル.
  • ... 3文字は何でもかまいません
  • (some chars)some charsを保存して後で参照するために$1
  • Muruの答えのように、renameコマンドのファイル名の最初の部分と一致する単純な正規表現を使用できます。より明示的な表現を使用して、実行するファイルと実行したくないファイルを区別したり、正規表現が多くの文字を吸い込まないようにしたい場合があります。通常、この種の問題を解決するには、多くの柔軟性があります。

これは、ではなく、正確にあなたが求めたものを与えないことに注意してください。数値の固定幅を維持します。ファイル名に固定幅の数字を使用することをお勧めします(そうしないと、たとえば、2の前に10が付いた、混乱した方法でソートされます)(そして、 renameを使用して、実際に要求した名前を作成する方法がわからないためです。もしそうなら、答えを更新します muruの答え それは...)。

Perl renameはデフォルトの17.10インストールに含まれていない であるため、17.10を実行している場合(または将来の読者の場合は、おそらくそれ以降のバージョン)、

Sudo apt install rename
6
Zanna

以下のコードは次のことを行います。

  1. MODで始まり.hdfで終わるすべてのファイルをループします
  2. 変数を割り当てます。これにより、ファイルごとに値が1ずつ増加します。
  3. リスト内の現在のファイルに対して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
5
Yaron