Mire la respuesta de Stephane para el mejor método, mire mi respuesta por razones para no usar las soluciones más obvias (y las razones por las cuales no son las más eficientes).
Puede usar la -I
opción de xargs
:
find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/
Que funciona en un mecanismo similar a find
y {}
. También citaría su -name
argumento (porque un archivo que comienza x
en el directorio actual se englobaría y pasaría como un argumento para encontrar, ¡lo que no dará el comportamiento esperado!).
Sin embargo, como lo señala manatwork, como se detalla en la xargs
página man:
-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.
Lo importante a tener en cuenta es que -L 1
significa que solo se procesará una línea de salida find
a la vez. Esto significa que es sintácticamente lo mismo que:
find /tmp/ -ctime -1 -name "x*" -exec mv '{}' ~/play/
(que ejecuta una sola mv
operación para cada archivo).
Incluso usando el -0
argumento GNU xargs y el find -print0
argumento causa exactamente el mismo comportamiento de -I
- esto es para clone()
un proceso para cada archivo 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/
pero como dice el hombre, eso "implica-x
y-L 1
". Así que no hay ganancia. Mejor que sea simple y usarfind . -exec mv '{}' ~/play/ \;