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


15

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

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

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

私はUbuntuのを頼む上の質問に答えるために、このバージョンの修正を提案し、別のユーザーが行の終わりを変更するには、コードを編集した\;ために+、それはより速くだとして(と、より正しいです?)。こちらをご覧ください

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

find: missing argument to '-exec'

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


この答えを参照していますか?これは、理由を説明するかもしれない
Wilf

@Wilfに感謝します。編集が行われた回答を表示するように更新しました。あなたが提供したリンクには、私の脳が対処できる方法でそれを説明する追加のリンクがあります。
15


@souravcに見事に周期的に感謝します。質問は、私のコマンドを編集したユーザーによるものです。最後に+、同じコマンドに複数の引数を提供していますが、mvそれに対処することはできません!
15

@Arronical mvは、私の答えを見ることができます^^
カオス

回答:


19

その投稿のユーザー+は、-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

+フラグを正しく使用するには、処理する引数をコマンドの中央ではなく末尾にする必要があります。それがあなたの例の中でfindtいている理由missing argument to '-exec'です。締め切りを逃し{}ます。


と一緒に使用する場合、なぜ最後の引数にfind -execする必要があるのかといつも疑問に思いました。OPのコマンドラインのような構造を機能させるのではなく、その設計決定が行われた理由を誰もが知っていますか?{}+
ピーターコーデス

11

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

「+」execのターミネータは「\;」より高速です  /ubuntu/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オプションなどが使用されない限り、構文がであるため、これがmoveコマンドで動作するかどうかはわかりません 。ただしls、複数のファイル名が指定されている場合は理解できるため、追加のオプションなどを使用せずに動作するはずです。+また、(つまり、エスケープする必要があるかもしれません\+


両方とも素晴らしい答えですが、少し速くなり、を説明するために、混chaosにしなければなりmv -tません。
15
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.