Copie los primeros n archivos de un directorio a otro

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 cpel comando osx no parece tener el
    -tinterruptor

  • execen algunas configuraciones diferentes

    Esto probablemente falló por problemas de sintaxis de mi parte: /
    Parece que no pude hacer headfuncionar una selección de tipo

Cualquier ayuda o sugerencias serán apreciadas.

¡Gracias de antemano!

Respuestas (2)

Necesitas la -Jopción con xargs.

find . -maxdepth 1 -type f | head -n5 | xargs -J X cp X /target/directory

La Jopción coloca todos los nombres de archivo en el marcador de posición X, que puede ser cualquier carácter y cpacepta 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 trtraducido 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
Excelente solución, ¡justo lo que buscaba! ¿Podría explicar la 'n' en head -n5? En cualquier caso, ¡muchas gracias y gracias @user3439894 por su aporte también!
@visyoual - Del manual: ` head [-n count | -c bytes] [archivo ...]`
De acuerdo. En mi búsqueda de otras soluciones antes de publicar esta pregunta, varias tenían el comando principal con -5y 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.
Como me mencionó en un comentario a mi respuesta, su solución no maneja nombres de archivo con espacios, ¿hay alguna forma de lograrlo modificando ligeramente su comando?
@visyoual, JSYK Si sus nombres de archivo contienen espacios, la solución de fd0 no funciona con nombres de archivo que contienen espacios y puede usar el de mi respuesta, que fd0 mejoró, hasta que actualice su respuesta.
@visyoual: depende de la versión de head que esté utilizando, con GNU head -n5significaría las primeras cinco líneas y -5significaría todas menos las últimas cinco líneas. Con cabezal BSD ambos son iguales.
@fd0 Gracias por la aclaración. A riesgo de presionar mi suerte aquí =] ¿sería marcadamente diferente una solución que maneje espacios en los nombres de archivo, o usar la respuesta de @ user3439894 sería la siguiente mejor opción? (Puramente académico)
@visyoual, fd0 actualizó su respuesta, usaría su respuesta actualizada sobre la mía.
@fd0, ¿por qué no usa el comando actualizado y elimina el que no maneja espacios? ¿Es entonces una razón para tener ambas versiones desde el punto de vista del uso aplicado?

Encontré una solución diferente sin xargso, -execpero 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)
Sugeriré que configure IFSen 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.
@fd0, Buena sugerencia. Sé que 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.
Gracias @fd0, me perdí el extra <en ... done < <( ...mis pruebas. :)