GNU/Linux >> Linux の 問題 >  >> Linux

find -exec mv {} ./target/ + が機能しないのはなぜですか?

Mac OSX でも同じ問題が発生しました 、ZSH を使用 シェル:この場合、-t はありません mv のオプション 、別の解決策を見つける必要がありましたが、次のコマンドは成功しました:

find .* * -maxdepth 0 -not -path '.git' -not -path '.backup' -exec mv '{}' .backup \;

秘密は中かっこを引用することでした . exec の最後に中括弧を付ける必要はありません コマンド。

Ubuntu 14.04 でテストしました (BASH を使用) および ZSH シェル)、同じように機能します。

ただし、 + を使用する場合 exec の最後にある必要があるようです。 コマンド。


マニュアル ページ (またはオンライン GNU マニュアル) では、ほぼすべてが説明されています。

find -exec コマンド {} \;

各結果について、command {} 実行されます。 {} のすべての出現 ファイル名に置き換えられます。 ; シェルが解釈しないように、スラッシュが前に付けられます。

find -exec コマンド {} +

各結果は command に追加されます そしてその後実行。コマンドの長さの制限を考慮に入れると、このコマンドはより多くの回数実行される可能性があり、マニュアル ページがサポートしてくれると思います:

<ブロック引用>

コマンドの呼び出しの総数は、一致したファイルの数よりもはるかに少なくなります。

マニュアルページからのこの引用に注意してください:

<ブロック引用>

コマンド ラインは、xargs がコマンド ラインを構築するのとほぼ同じ方法で構築されます

そのため、{} の間に文字は使用できません および + 空白を除く。 + find は xargs のように引数をコマンドに追加する必要があることを検出させます .

解決策

幸いなことに、mv の GNU 実装は -t のいずれかで、ターゲットディレクトリを引数として受け入れることができます またはより長いパラメーター --target .使用方法は次のとおりです:

mv -t target file1 file2 ...

あなたの find コマンドは次のようになります:

find . -type f -iname '*.cpp' -exec mv -t ./test/ {} \+

マニュアルページから:

<ブロック引用>

-exec コマンド;

コマンドを実行します。 0 ステータスが返される場合は true。以降の find の引数はすべて、`;' で構成される引数まで、コマンドの引数と見なされます。遭遇します。文字列 `{}' は、find のいくつかのバージョンのように単独である引数だけでなく、コマンドの引数に出現するすべての場所で処理中の現在のファイル名に置き換えられます。これらの構造は両方とも、シェルによる展開から保護するために (`\' で) エスケープするか、クォートする必要があるかもしれません。 -exec オプションの使用例については、例のセクションを参照してください。指定されたコマンドは、一致したファイルごとに 1 回実行されます。コマンドは開始ディレクトリで実行されます。 -exec アクションの使用には、避けられないセキュリティ上の問題があります。代わりに -execdir オプションを使用してください。

-exec コマンド {} +

-exec アクションのこのバリアントは、選択されたファイルに対して指定されたコマンドを実行しますが、コマンド ラインは、選択された各ファイル名を最後に追加することによって構築されます。コマンドの呼び出しの総数は、一致したファイルの数よりもはるかに少なくなります。コマンド ラインは、xargs がコマンド ラインを構築するのとほぼ同じ方法で構築されます。コマンド内で使用できる `{}' のインスタンスは 1 つだけです。コマンドは開始ディレクトリで実行されます。


find -iname ... -exec mv -t dest {} + の標準的な同等物 find の場合 -iname をサポートしない実装 または mv -t をサポートしない実装 シェルを使用して引数の順序を変更することです:

find . -name '*.[cC][pP][pP]' -type f -exec sh -c '
  exec mv "[email protected]" /dest/dir/' sh {} +

-name '*.[cC][pP][pP]' を使用して 、現在のロケールに依存して c の大文字バージョンを決定することも回避します または p .

+ に注意してください 、; に反して はどのシェルでも特別なものではないので、引用する必要はありません (ただし、rc のようなシェルを除いて、引用しても害はありません) \ をサポートしていない 引用演算子として)

末尾の / /dest/dir/mv foo.cpp の名前を変更する代わりに、エラーで失敗します /dest/dircpp が 1 つだけの場合 ファイルが見つかり、/dest/dir 存在しないか、ディレクトリ (またはディレクトリへのシンボリック リンク) ではありませんでした。


Linux
  1. / bin/shが/bin/bashではなく/bin/ dashを指すのはなぜですか?

  2. 「キャッシュディレクトリ/home//.composer/cache/repo/https—packagist.org/を作成できません。または、ディレクトリが書き込み可能ではありません。キャッシュなしで続行しますか?」

  3. プロセスが実行されているフォルダーを見つける方法は?

  1. なぜ /home 以外のものを別のパーティションに入れるのですか?

  2. echo または print /dev/stdin /dev/stdout /dev/stderr

  3. /home、/usr、/var などのディレクトリがすべて同じ inode 番号 (2) を持っているのはなぜですか?

  1. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  2. 12.04Grub-efiを/target/にインストールできませんか?

  3. /dev/tcp を使用するために < または > が必要な理由