web-dev-qa-db-ja.com

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

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

これは私が使用するコマンドです:

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

Askbuntuに関する質問に答えるために、このバージョンの修正版を提案しました。別のユーザーがコードを編集して、\;の行末を+に変更しました(より正確ですか?)。 こちらを参照

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

find: missing argument to '-exec'

私はなぜそれがこのように振る舞うのか、または正しいコマンドが何であるかを理解していません。コマンド修正を投稿するだけでなく、盲目的に提案に従うだけではなく、理解したいと思います。

15
Arronical

その投稿のユーザーは、+コマンドの最後にある-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

+フラグを正しく使用するには、処理する引数がコマンドの中央ではなく末尾になければなりません。あなたの例でfindmissing argument to '-exec'を投げるのはそのためです;終了{}を見逃しています。

19
chaos

ユーザーが編集内容を説明しました。

'+' exec's terminator is faster than '\;' see https://askubuntu.com/questions/558817/what-is-the-difference-between-using-and-in-exec-command; and creating a backup file from original file is good idea

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

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

ls file1
ls file2
ls file3

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

ls file1 file2 file3

;および+を使用して利用できる他のフォームもあります( here :から)

したがって、次の構文例はfindコマンドに使用できます。

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

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

10
Wilf