findコマンドをmvコマンドと統合するには?

findコマンドをmvコマンドと統合するには?

名前が大文字で始まるすべてのファイルを現在のディレクトリからu下のディレクトリに移動しようとしています~/tmp

このコマンドを試しましたが、find . -type f -name "*[[upper]]*" -exec mv -t ~/tmp/u
動作しません。

答え1

あなたは非常に近いです。

  1. マークアップにはコロンを使用する必要があります[[:upper:]]

  2. "*[[:upper:]]*"すべての名前を探す含む大文字。名前のあるファイルのみをインポートするスタート大文字の場合"[[:upper:]]*"(最初の文字を省略  *)を使用します。

  3. ただ言うと

    find . -name '[[:upper:]]*'
    

    そうだろうリスト名前が大文字で始まるすべてのファイル。ただし、使用する場合は、コマンドにファイル名を含めるように指示する  -exec必要があります。find{}

    (そしてあなたはいつもfindコマンドの実行を指示する前に、印刷専用モードでコマンド、特にファイルシステムを変更するコマンドをデバッグしてください。使用は一般的なデバッグ技術です。 )-exec echo mv …

  4. ただし、使用する場合は、コマンドを(またはそれに対応する)またはで終了する必要が-execあります。 (より';'\;+マニュアルページまたはこの質問に対するStéphane Chazelasの答え、区別のため。 )使用していますのでmv -t使用してください  +

だから最後のコマンドは

find . -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +

答え2

GNU実装の構文は次のmvとおりです。

find . -type f -name '[[:upper:]]*' -exec mv -t ~/tmp/u {} +

または標準的に:

find . -type f -name '[[:upper:]]*' -exec sh -c '
   exec mv "$@" ~/tmp/u/' sh {} +

これはファイル名のパターンと一致するためのものです。スタート大文字の場合は、大文字(大括弧式[:upper:]内のPOSIX文字クラス[...])とその後に必要な数の文字(*)が一致するようにします。

findエンドポイントがどこにあるかを教えてください-exec some command with its args。それは:

  • コマンドをファイルごとに1回実行するように指示する引数;(シェルコマンドラインでは引用符で囲む必要があります。たとえば';'、、\;...";";すべてのシェルで特殊文字でもあります)(この場合、コマンドラインパラメータはファイルパス置き換えられます。find{}
  • またはパラメータの順序です{} +。 1つしか存在できず、{}その前に来なければなりません+。この場合、コマンドは複数のファイルに対して同時に呼び出され、{}ファイルのリストに置き換えられます。

最後に、find次を実行します。

  • mv -t /home/you/tmp/u ./File1 ./File2 ./dir/File3...最初のケースでは、-tすべてのソースファイルが最後に配置されるようにします。
  • sh -c 'mv "$@" ~/tmp/u/' sh ./File1 ./File2 ./dir/File3...POSIXly。それ以外の場合は、パラメータを最後に配置できるように呼び出して-tパラメータの順序を変更する必要があります。ここでの最終実行は次のとおりです。 (同じプロセスでは、いくつかの実装はすでに明示的である必要はない最適化を実行しているためです。)sh~/tmp/u/shmv ./File1 ./File2 ./dir/File3... /home/you/tmp/u/execshexec

末尾は入力を保証すること/です。mv ... ~/tmp/u/mv引っ越すモデル。mv a bまたは名前ab移動する)またはb/a引っ越す)bディレクトリかどうかによって異なります。末尾を追加することによって、/我々はそれが後者であることを確認します。または、少なくともbディレクトリではない場合は、名前が次のようaに変わるのではなくエラーが報告されますb(do移動する)。上記のコードは、findファイルが1つだけ見つかった場合のものです。 (複数ファイル移動)は常にfindmv a b c引っ越す次の作業(cディレクトリでなければなりません)移動するこの場合は意味がありません。

答え3

find . -type f -name "[A-Z]*" -exec mv  {} <destination directory> \;

関連情報