web-dev-qa-db-ja.com

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

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

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
12
Rocky86

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

満足したら-nを削除します。

15
SHawarden

試してください:

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
11
John1024

あなたが投稿した小さなチャレンジが好きだったので、これが私の解決策です。私はすべてのファイルが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はファイルごとに1回フォークします。 Perlのrenameコマンドはサポートしていません。

(Perlのrenameコマンドにはいくつかの制限がありますが、この特定のケースではそれらの制限は適用されません。)

前に示したrenameコマンドと同様に、機能しますが、2種類の名前変更などの間で混乱が生じます。あなたが正しいものを持っているなら、素晴らしいですが、そうでなければ、これもうまくいきます。

Perl-renameコマンドがなく、インストールできない場合は、次のようにします。

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

ご覧のとおり、これは上の回答で示したものと同じ置換を使用しています。もちろん、Perlの名前の変更には他にも注意が必要です(一番上の答えは-nすでに、次に-0-fなど)、そして必要な数が多いほど、この方法で独自にロールするのではなく、インストールする必要があります。

1
sitaram