xargsを使ってファイルを見つけて移動する方法は?

xargsを使ってファイルを見つけて移動する方法は?

いくつかのファイルを見つけて移動したいです。

以下のファイルを見つけることができます。

$ find /tmp/ -ctime -1 -name x*

~/play私のディレクトリに行ってみました。

$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/

しかし、それはうまくいきませんでした。明らかに、mvには2つのパラメータが必要です。
mvコマンドでxargs "現在のプロジェクト"を参照するか(またはどのように)わからないのですか?

ベストアンサー1

最善のアプローチに対するStephaneの答えと、より明確なソリューションを使用しない理由(そして最も効率的ではない理由)に対する私の答えを確認してください。

次の-Iオプションが利用可能ですxargs

find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/

動作メカニズムはfindと に似ています{}。また、あなたの主張を引用します-name。 (現在のディレクトリのファイルがxグローバル化され、findの引数として渡されるためです。これは予想される動作を提供しません!)

ただし、Manatworkが指摘したように、xargsマニュアルページに詳しく説明されています。

   -I replace-str
          Replace occurrences of replace-str in the initial-arguments with
          names read from standard input.  Also, unquoted  blanks  do  not
          terminate  input  items;  instead  the  separator is the newline
          character.  Implies -x and -L 1.

注目すべき重要な点は、これが-L 11つだけ存在することを意味することです。ワイヤーfind出力は一度に処理されます。これは構文的に次のようになります。

find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/

(シングルmvタスクを実行します。文書)。

GNU -0xargs引数とfind -print0引数を使用してもまったく同じ動作が発生します。ファイル固有のプロセス-Iは次のとおりです。clone()mv

find . -name "x*" -print0 | strace xargs -0 -I '{}' mv '{}' /tmp/other

.
.
read(0, "./foobar1/xorgslsala11\0./foobar1"..., 4096) = 870
mmap(NULL, 135168, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) =     0x7fbb82fad000
open("/usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26066, ...}) = 0
mmap(NULL, 26066, PROT_READ, MAP_SHARED, 3, 0) = 0x7fbb82fa6000
close(3)                                = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 661
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 661
--- SIGCHLD (Child exited) @ 0 (0) ---
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,         child_tidptr=0x7fbb835af9d0) = 662
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 662
--- SIGCHLD (Child exited) @ 0 (0) ---
.
.
.

おすすめ記事