特定のファイルグループをBashの特定のフォルダグループに移動する

特定のファイルグループをBashの特定のフォルダグループに移動する

たとえば、次のファイルセットを移動したい場合Chapter1_sectionXをbook/chapter1などの特定のフォルダにそしてChapter2_sectionXから本/chapter2へなど。私は現在このアプローチを使用していますが、非効率的だと思います。

touch chapter{1,2}_section{1..4}.odf
mkdir -p book/chapter{1,2}
mv chapter1_section* book/chapter1
mv chapter2_section* book/chapter2

使用せずにこれを行うより短い方法はありますか?~のためリング?

ベストアンサー1

forループを使用しませんか? Perlユーティリティ(rename一部のディストリビューションでは、prenameまたfile-renameはとも呼ばれるperl-rename)を使用してサブディレクトリを作成し、その中にファイル名を変更できます。たとえば、

$ rename -v 'BEGIN{mkdir "book"};
             if (m/chapter(\d+)/) {
               my $d="book/chapter$1";
               mkdir $d;
               $_ = "$d/$_"
             }' *
chapter1.txt renamed as book/chapter1/chapter1.txt
chapter2.txt renamed as book/chapter2/chapter2.txt
chapter3.txt renamed as book/chapter3/chapter3.txt
chapter4.txt renamed as book/chapter4/chapter4.txt
chapter5.txt renamed as book/chapter5/chapter5.txt

スクリプトの英語の要約:

現在のファイル名($_)が正規表現と一致する場合は、ファイル名chapter(\d+)から章番号を抽出し(つまり$1、正規表現の最初で唯一のキャプチャグループです(\d+))、その章のディレクトリを作成してから、現在のファイルの名前を次のように変更します。 。礼拝の規則。

一致しないファイル名は無視されます。

renamePerlは、名前変更スクリプトが.perl値を変更した場合にのみファイルの名前を変更しようとします$_。また-f、このオプションを使用して、強制的に使用しない限り、既存のファイルの上書きを拒否します。

Perlの名前変更を使用すると、次のことができます。どのスクリプト内のPerlコードの名前を変更します(ただしプラグマがuse strict適用されるため、変数を宣言する必要があります)。コードが変更されると、$_ファイル名が変更されます。そうでなければそうではありません。

まず、テスト実行を実行し、-n名前変更が必要に応じて機能することを確認するのが最善です(間違ったバッチの名前変更から回復することは主要なPITAになる可能性があります)。 -nファイル名を変更せずに内容のみを表示します。会議する。詳細な出力のために(上記と同じ)-nに置き換える-vか、-n自動操作のために削除してください。

おすすめ記事