-exec に欠けている引数は何ですか?

-exec に欠けている引数は何ですか?

次のコマンドを使用して、30 日以上経過したファイルとディレクトリをディレクトリから削除し、それらをアーカイブ ディレクトリに移動します。数週間後に、誰もファイルの返還を要求しない場合は、このディレクトリを削除できます。ターゲット ディレクトリにはユーザー名によるサブディレクトリがあり、アーカイブ ディレクトリにも同様のものが含まれます。

私が使用するコマンドは次のとおりです:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

私は、ask ubuntu の質問に答えるために、これの修正版を提案しましたが、別のユーザーがコードを編集して行末を変更し、\;より+高速 (かつより正確?) にしました。こちらをご覧ください

ただし、+この方法を使用すると、-execコマンドがls -lh実際に使用するコマンドでは機能しませんが、 で試してみると、+エラー メッセージが表示されます。

find: missing argument to '-exec'

なぜこのように動作するのか、正しいコマンドは何なのか理解できません。コマンドの修正だけを投稿しないでください。提案に盲目的に従うのではなく、理解したいと思います。

答え1

その投稿のユーザーは、コマンド+の末尾に記号があると-exec高速になると述べたかもしれませんが、その理由については述べていません。

findコマンドが次のファイルを返すと仮定します。

/path/to/file1
/path/to/file2
/path/to/file3

通常の-execコマンド ( -exec command {} \;) は、一致するファイルごとに 1 回実行されます。例:

find ... -exec mv {} /target/ \;

実行:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

+記号 ( )を使用すると、-exec command {} +コマンドの末尾に複数の一致したファイルを追加してコマンドが構築されます。例:

find ... -exec mv -t /target/ {} +

実行:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

フラグを正しく使用するには、+処理する引数をコマンドの途中ではなく最後に配置する必要があります。これが、例でfindtrows が発生する理由ですmissing argument to '-exec'。閉じる が抜けています{}

答え2

ユーザーは編集内容を説明しまし...

'+' exec のターミネータは '\;' よりも高速です。https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command を参照してください。元のファイルからバックアップ ファイルを作成することをお勧めします。

...使用してこのリンク基本的には複数のコマンドを使用する代わりに、すべてのファイル名を1つのコマンドインスタンスに送信して処理を高速化します。以下はここ:

-execをセミコロン(find . -exec ls '{}' \;)とともに使用すると、

ls file1
ls file2
ls file3

ただし、代わりにプラス記号 ( find . -exec ls '{}' \+) を使用すると、すべてのファイル名が単一のコマンドに引数として渡されます。

ls file1 file2 file3

;とを使った他の形式も利用可能です+ここ:)

したがって、find コマンドでは次の例の構文が許可されます。

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

mv [OPTION]... SOURCE DESTただし、オプションまたは類似のオプションを使用しない限り、構文は であるため、移動コマンドでこれが機能するかどうかはわかりません 。ただし、複数のファイル名が指定されている場合は理解できるため、追加のオプションなどなしでも-t機能するはずです。もエスケープする必要がある可能性があります (つまり)ls+\+

関連情報