Quiero encontrar algunos archivos y luego moverlos.
Puedo encontrar el archivo con:
$ find /tmp/ -ctime -1 -name x*
Traté de moverlos a mi ~/play
directorio con:
$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/
Pero eso no funcionó. Obviamente mv necesita dos argumentos.
¿No está seguro de si (o cómo) hacer referencia al 'elemento actual' de xargs en el comando mv?
-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/ \;
Respuestas:
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 dexargs
:Que funciona en un mecanismo similar a
find
y{}
. También citaría su-name
argumento (porque un archivo que comienzax
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:Lo importante a tener en cuenta es que
-L 1
significa que solo se procesará una línea de salidafind
a la vez. Esto significa que es sintácticamente lo mismo que:(que ejecuta una sola
mv
operación para cada archivo).Incluso usando el
-0
argumento GNU xargs y elfind -print0
argumento causa exactamente el mismo comportamiento de-I
- esto es paraclone()
un proceso para cada archivomv
:fuente
Con herramientas GNU:
La opción
-t
(--target
) es específica de GNU.-print0
,-r
,-0
, Mientras que no estándar y originarios de GNU también se encuentran en algunas otras implementaciones, como en algunos BSDs.POSIXY:
Ambos ejecutan tan pocos
mv
comandos como sea necesario y funcionan con los caracteres que puedan contener los nombres de archivo. El GNU One puede tener la ventaja de seguirfind
buscando archivos mientrasmv
comienza a mover el primer lote.Tenga en cuenta que todos los archivos y directorios terminarán en un directorio, tenga cuidado con los conflictos si varios archivos en diferentes directorios tienen el mismo nombre.
fuente
mv
una vez todos los argumentos (o todos-L
o-n
, si se proporcionan). De lo contrario, llamarmv
a cada archivo se volverá viejo (y lento) rápidamente.Quizás este comando es posible ahora y no fue en 2013, pero esto funciona perfectamente para mí:
La
-t
clave coloca primero la carpeta de destino, liberando elmv
comando para tener todos los últimos argumentos como solo los archivos que se moverán.fuente
Puede probar con el siguiente comando y probado y funcionó bien
fuente