Посмотрите на ответ Стефана за лучший метод, посмотрите на мой ответ по причинам, по которым не используются более очевидные решения (и по причинам, по которым они не являются наиболее эффективными).
Вы можете использовать -I
опцию xargs
:
find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/
Который работает по аналогичному механизму find
и {}
. Я бы также процитировал ваш -name
аргумент (потому что файл, начинающийся с x
данного каталога, будет глобализирован и передан в качестве аргумента для поиска - что не даст ожидаемого поведения!).
Однако, как указано в 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
означает, что одновременно обрабатывается только одна строка вывода find
. Это означает, что это синтаксически так же, как:
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
(который выполняет одну mv
операцию для каждого файла).
Даже использование -0
аргумента GNU 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) ---
.
.
.
-I
:,find . | xargs -I'{}' mv '{}' ~/play/
но, как говорит человек, это «подразумевает-x
и»-L 1
. Так что никакой выгоды. Лучшеfind . -exec mv '{}' ~/play/ \;