web-dev-qa-db-ja.com

コマンドラインで複数のディレクトリの名前を変更する

と呼ばれるいくつかのフォルダーがあります。

Session 1
Session 2
Session 3
Session 4
Session 5
Session 6
Session 7
Session 8

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

Folder 1
Folder 2
Folder 3
Folder 4
Folder 5
Folder 6
Folder 7
Folder 8

ターミナルで最も効果的な方法でこれを行うにはどうすればよいですか?

mmvmvrenameについては知っていますが、何を使うべきか、どうすればいいのかわかりません。

2
Rtsne42

プレネーム

最も簡単な方法は、Perlスクリプトであるrenameまたはprenameを使用することです(kshまたはmkshユーザーの場合、シェルにはrenameビルトイン関数は異なるため、一貫性を保つために、Perlスクリプトを参照するときにprenameを使用します。代わりに、/usr/bin/rename-実行可能ファイルへのフルパスを呼び出すこともできます)。

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/
$ prename 's/Session/Folder/' Session*/                                                                                  
$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

再帰検索が必要な場合、または適切なタイプのアイテムを確実に見つける場合(ファイル名にWordの「セッション」を含むファイルがある場合があります)、それをfindユーティリティと組み合わせることができます。

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

$ find -maxdepth 1 -type d -name "Session *" -exec prename 's/Session/Folder/' {} \;                                      

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

少し長く、多分少し冗長ですが、動作します。

mv

mvの小さな問題は、毎回宛先の名前を変更する必要があるため、それ自体では必要なことを実行できないことです。そのためには、findbashのツールなど、他のツールと組み合わせる必要があります。

$ ls
Session 1/  Session 2/  Session 3/  Session 4/  Session 5/  Session 6/  Session 7/  Session 8/


$ for dir in Session*/ ; do mv "${dir}" "Folder ${dir##*\ }" ;done                                                       

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/

ここに表示されているのは、Word Sessionを含み、ディレクトリにあるすべてのアイテムをループしていることです。パラメータ展開 `$ {dir ## * \}"を使用して、ディレクトリ名のスペース(それぞれの番号)の後のすべてを抽出し、新しい文字列 "Folder /"を形成します。

prenameコマンドとmvの両方で、グロビングを使用しています。つまり、これらのアプローチは、everyという単語を含むディレクトリの名前を変更します。 。もちろん理想的ではありませんが、フォルダの命名が一貫していることがわかっている特定のケースでは、それは機能します。または、for dir in Session\ [1-9] ; do . . .doneでコマンドを拡張できます。

つまり、このアプローチは機能しますが、非常に単純化されており、最適ではありません。

Python

もちろん、他のツールも使用できます。たとえば、Python:

$ ls
Session 1/  Session 3/  Session 5/  Session 7/
Session 2/  Session 4/  Session 6/  Session 8/

$ python -c 'import os,shutil;map(lambda x:shutil.move(x,x.replace("Session","Folder")),os.listdir("."))'                

$ ls
Folder 1/  Folder 2/  Folder 3/  Folder 4/  Folder 5/  Folder 6/  Folder 7/  Folder 8/
9

名前を変更するすべてのフォルダーを含むフォルダーに移動して、次の操作を行います。

find . * | rename 's\Session\Folder\'
0