と呼ばれるいくつかのフォルダーがあります。
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
ターミナルで最も効果的な方法でこれを行うにはどうすればよいですか?
mmv
mv
とrename
については知っていますが、何を使うべきか、どうすればいいのかわかりません。
最も簡単な方法は、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
の小さな問題は、毎回宛先の名前を変更する必要があるため、それ自体では必要なことを実行できないことです。そのためには、find
やbash
のツールなど、他のツールと組み合わせる必要があります。
$ 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:
$ 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/
名前を変更するすべてのフォルダーを含むフォルダーに移動して、次の操作を行います。
find . * | rename 's\Session\Folder\'