web-dev-qa-db-ja.com

特定の単語を含むフォルダを移動するシェルスクリプト

/var/www/uploads/の名前にMathまたはPhysicsを含む/mnt/Backup/内のすべてのフォルダーをmvする簡単なシェルスクリプトを探しています] _。

3
SaulGoodman

これによるとSO投稿: xargsを使用して「find」ディレクトリを別のディレクトリに移動する
私は次のようなものを使用します:

 find /var/www/uploads/ -type d  \( -name '*Physics*' -o -name '*Math*' \) \
    -exec mv -t /mnt/Backup/ {} +

これにより、/var/www/uploadsフォルダ内の任意の深さのディレクトリが検索され、バックアップディレクトリに移動されます。
検索を最初のレベルに制限したい場合は、オプション-maxdepth 1を見つけるために追加できます

find /var/www/uploads/ -maxdepth 1 -type d  \( -name '*Physics*' -o -name '*Math*' \) \  
-exec mv -t /mnt/Backup/ {} +

また、大文字と小文字を区別しない検索が必要な場合は、-inameの代わりに引数-nameを使用できるため、次のようになります。

 find /var/www/uploads/ -type d  \( -iname '*Physics*' -o -iname '*Math*' \) \
   -exec mv -t /mnt/Backup/ {} +

注:
これは、GNUまたはFreeBSDfindおよびmv-iname-maxdepth)の最近のバージョンでのみ機能します。および-tは標準ではありません)。

また、\を使用して、コマンドラインにジャンプラインを追加し、読みやすくします。

注2:注2:

コマンドをよく理解したい場合は、試してみてください このExplainShellリンク

2
Kiwy

UNIXコマンドfindとオプション-dを使用してディレクトリのみを検索し、コマンドを実行してディレクトリを/ mnt/Backupに移動するように指示します。正規表現を使用して1つのステップで実行する代わりに、次のようにコマンドを2回実行するだけです。

find /var/www/uploads -type d -name "*Math*" -exec mv {} /mnt/Backup/ \;
find /var/www/uploads -type d -name "*Physics*" -exec mv {} /mnt/Backup/ \;

多数のディレクトリ名に対して同じことを行い、名前を繰り返す必要がないようにする場合は、代わりに変数を使用できます。

for name in Math Physics; do find /var/www/uploads -d -name "*${name}*" -exec mv {} /mnt/Backup/ \;
2
Jenny D