Estoy buscando copiar los primeros archivos 'n' de un directorio a otro directorio, preferiblemente con solo herramientas cli (sin scripts).
He intentado lo siguiente:
find . -maxdepth 1 -type f | head -5 | xargs cp -t /target/directory
Esto parecía prometedor, pero falló porque
cp
el comando osx no parece tener el
-t
interruptor
exec
en algunas configuraciones diferentes
Esto probablemente falló por problemas de sintaxis de mi parte: /
Parece que no pude hacerhead
funcionar una selección de tipo
Cualquier ayuda o sugerencias serán apreciadas.
¡Gracias de antemano!
Necesitas la -J
opción con xargs
.
find . -maxdepth 1 -type f | head -n5 | xargs -J X cp X /target/directory
La J
opción coloca todos los nombres de archivo en el marcador de posición X, que puede ser cualquier carácter y cp
acepta varios archivos en un directorio de destino. Se puede visualizar como-
cp file1 file2 file3 file4 file5 DESTINATION
EDITAR:
Para manejar nombres de archivo con espacios, hemos tr
traducido el carácter de nueva línea al carácter nulo después de cada nombre de archivo y luego hemos hecho que xargs maneje el bit nulo como un separador para los nombres de archivo.
find . -maxdepth 1 -type f | head -n5 | tr '\n' '\0' | xargs -0 -J X cp -- X /target/directory
Encontré una solución diferente sin xargs
o, -exec
pero creo que la respuesta de fd0 es una mejor manera de hacerlo:
while IFS= read -r f; do cp "$f" "/target/directory/"; done < <(find . -maxdepth 1 -type f | head -n5)
IFS
en nada: IFS=
para manejar cualquier espacio inicial o final en un nombre de archivo y usar la sustitución de proceso en lugar de la sustitución de comando y una cadena aquí. Su solución definitivamente será más lenta pero manejará nombres de archivo con espacios en ellos. Mi solución no estará en su forma actual.IFS=
sería, IFS=; while read ...
pero no estoy seguro de cómo cambiar la sustitución del comando y aquí la cadena para la sustitución del proceso , sin investigar un poco. No me importaría que me mostraras o incluso editaras mi respuesta, gracias.<
en ... done < <( ...
mis pruebas. :)
visual
head -n5
? En cualquier caso, ¡muchas gracias y gracias @user3439894 por su aporte también!fd0
visual
-5
y sin-n5
. No estaba seguro de si eso era una taquigrafía aceptable o un error de sintaxis. Supongo que todavía no estoy seguro.usuario3439894
usuario3439894
fd0
-n5
significaría las primeras cinco líneas y-5
significaría todas menos las últimas cinco líneas. Con cabezal BSD ambos son iguales.visual
usuario3439894
usuario3439894