いくつかのファイルを見つけて移動したいです。
以下のファイルを見つけることができます。
$ 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 1
1つだけ存在することを意味することです。ワイヤーfind
出力は一度に処理されます。これは構文的に次のようになります。
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
(シングルmv
タスクを実行します。各文書)。
GNU -0
xargs引数と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) ---
.
.
.
答え2
たぶんこのコマンドは2013年には可能ではなく、今は可能ですが、私は完璧に動作しました。
ls pattern* | xargs mv -t DESTINATION/
この-t
キーはターゲットフォルダを最初に配置し、mv
コマンドが最後の引数をすべて移動するファイルとして使用できるようにします。
答え3
GNUツールの使用:
find /tmp/ -ctime -1 -name 'x*' -print0 |
xargs -r0 mv -t ~/play/
-t
()オプションは--target
GNUにのみ適用されます。-print0
、、、非標準およびGNU派生エントリも、いくつ-r
か-0
のBSDなどの他のいくつかの実装に存在します。
POSIX的に:
find /tmp/ -ctime -1 -name 'x*' -exec sh -c '
exec mv "$@" ~/play/' sh {} +
どちらもmv
必要な数のコマンドを実行し、ファイル名に含めることができる任意の文字を使用できます。 GNU は、最初のファイル配置の移動を開始するfind
際にファイルを継続的に検索するという利点があります。mv
すべてのファイルとディレクトリは1つのディレクトリにあります。異なるディレクトリにある複数のファイルが同じ名前を持つ場合、競合が発生する可能性があることに注意してください。
答え4
次のコマンドを試してテストしてみてください。
find /tmp/ -ctime -1 -type f -name "x*" -exec mv -t ~/play/ {} \;