web-dev-qa-db-ja.com

file1、file2、file3などに異なる名前を持つ複数のファイルの名前を変更するにはどうすればよいですか?

私のフォルダにこれらのファイルがあるとしましょう:

cat.txt
dog.txt
house.txt
tree.txt

すべての名前を次のように変更します。

file1.txt
file2.txt
file3.txt
file4.txt

コマンドライン経由でそれを行うことは可能ですか?

名前の変更dog1.txtdog2.txt-> cat1.txtcat2.txtのような、何らかのパターンのファイルの名前変更に関する質問を見ただけです。

4
Denis Alves

これを行うには、renameユーティリティを使用します。

rename -n '$_ = sprintf "file%d.txt", ++$::count' *

ノート

  • -nは、コマンドを実行すると何が起こるかを示します。出力が必要なものであった場合は、-nなしで実行して、実際にファイルの名前を変更します。
  • *を、名前を変更したいものに置き換えます。たとえば、dog*.txtdog1.txtのみをdog2.txtfile1.txtなどに変更するには、file2.txtを使用します。
  • $_は、変更する必要があるデフォルトの入力(ファイル名)です。
  • =を使用して変更しています
  • sprintfでは、fileで始まり、その後に%dが続くスキーマを定義しています。これは、数値を意味し、.txtで終わります。
  • 番号(%d)は、++$::countを使用して割り当てられます。これは、名前を変更するたびに繰り返される単純なカウンターです。

アイデアは ここから来ています

5
Ravexina

可能性があります完了しましたが、いくつか注意点があります。あなたは「...これらのファイルは私のフォルダにある」と述べたが、これはそのような警告の一つになるだろう。 globstarを使用して、展開されたファイル名を反復処理できます。

$ c=0;for f in *; do ((c++));  echo "$f" "--->" file"$c".txt ; done                            
cat.txt ---> file1.txt
dog.txt ---> file2.txt
house.txt ---> file3.txt
tree.txt ---> file4.txt

もちろん、list.txtを介して常に「手動」の方法で行くことができます。そこでは、ファイル名のリストを保存し、while IFS= read -r ; do ... done < list.txtを介してそのファイルを読み取ることができます

$ c=0; while IFS= read -r f; do ((c++)); echo "$f" file"$c" ; done < input.txt                 
cat.txt file1
dog.txt file2
tree.txt file3

もちろん、このリストテーマは、csvリスト、jsonファイル、キー値リストなど、さまざまな方法で拡張できます。これらのオンラインに関する質問はたくさんあります。もちろん、ファイルへのフルパスを指定したり、リストと同じディレクトリ内ですべてを実行したりするなど、他の選択肢もあります。

最後に、私はすでにキーと値のリストをほのめかしています。 bashおよびその他のPythonやPerlなどの最新のスクリプト言語を使用すると、ファイルのリストとファイルに対応する新しい名前を持つハッシュ(または辞書)を作成できます。

2