1つのディレクトリにある複数のファイルの名前を同時に変更する方法

1つのディレクトリにある複数のファイルの名前を同時に変更する方法

私のディレクトリには/var/tmp/abc4つのファイルがあります。

12345-ram-3e3r5-io9490-89adu9.csv
45434-dam-qwe35-to9490-43adu9.csv
11234-cam-yy3r5-ro9490-85adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv

すべてのCSVファイルの名前を最も短い方法(おそらく1行)に変更したい(すべてのファイルを見つけて名前を変更する)。

XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

答え1

rename -n 's/(\w+)/XXXXX/' *.csv

満足のいくものを削除してください-n

答え2

努力する:

for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done

仕組み:

  • for f in *.csv; do

    これにより、すべてのファイルに対してループが開始されます*.csv

  • mv -i -- "$f" "XXXXX-${f#*-}"

    必要に応じてファイルの名前を変更し、ファイルを上書きする前に対話形式で尋ねます。

  • done

    これはサイクルの終わりを示します。

例:

$ ls -1
11234-cam-yy3r5-ro9490-85adu9.csv
12345-ram-3e3r5-io9490-89adu9.csv
14423-sam-hh3r5-uo9490-869du9.csv
45434-dam-qwe35-to9490-43adu9.csv
$ for f in *.csv; do mv -i -- "$f" "XXXXX-${f#*-}"; done
$ ls -1
XXXXX-cam-yy3r5-ro9490-85adu9.csv
XXXXX-dam-qwe35-to9490-43adu9.csv
XXXXX-ram-3e3r5-io9490-89adu9.csv
XXXXX-sam-hh3r5-uo9490-869du9.csv

答え3

すべてのファイルが5つの数字で始まると仮定するので、次のようにします。切り取りコマンド初期番号ファイルを「XXXXX」に置き換えます。

以下はコマンド前のファイルです。

-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 11111_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 12345_baz_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml

以下は1行のコマンドです。

for src in *.csv; do dst=XXXXX$(echo $src| cut -c6-); mv $src $dst; done;

以下はコマンドの後のファイルです。

-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 67890_foo_file.xml
-rw-rw-r--. 1 daniel daniel 0 May 13 22:54 XXXXX_bar_file.csv
-rw-rw-r--. 1 daniel daniel 0 May 13 23:18 XXXXX_baz_file.csv

引用:

Bashでコマンド出力を繰り返します。

Bashのサブストリング

答え4

フォークがない場合:

ls | perl -lne '$suf=substr($_,6); rename $_, "XXXXX-$suf"'

シェルループを使用すると、mv各ファイルが一度分岐します。 Perlrenameコマンドはそうではありません。

(Perlの名前変更コマンドにはいくつかの制限がありますが、この特別な場合には適用されません。)

前述のコマンドはrenameそうです。動作しますが、2つの異なる名前変更タイプの間に混乱が生じる可能性があります。正しいものがあれば良いですが、そうでない場合でも効果があります。

perl-rename コマンドがなく、インストールできない場合は、次のことができます。

ls | perl -lne '$old=$_; s/(\w+)/XXXXX/; rename $old, $_'

ご覧のとおり、これは最上位の回答に示されているものと同じ置換を使用します。もちろん、perl-renameには他のアドオンもあります(-n上の答えですでに述べたように、、、-0など-fがあります)。必要に応じてスクロールするのではなく、この方法でインストールする必要があります。

関連情報