scripts - shell script linux español




pasar la salida como un argumento para cp en bash (3)

Esta pregunta ya tiene una respuesta aquí:

Estoy tomando una clase de Unix / Linux y todavía tenemos que aprender variables o funciones. Acabamos de aprender algunas utilidades básicas como el indicador y canalización, salida y anexar al archivo. En la tarea de laboratorio, quiere que encontremos los archivos más grandes y los copiemos en un directorio.

Puedo obtener los 5 archivos más grandes pero no sé cómo pasarlos a cp en un solo comando

ls -SF | grep -v / | head -5 | cp ? Directory

Podría ser:

cp `ls -SF | grep -v / | head -5` Directory

Suponiendo que la tubería es correcta. Los backticks sustituyen en la línea la salida de los comandos dentro de ella.

También puedes hacer tus pruebas:

cp `echo a b c` Directory

copiará todos los a , b , c en el Directory .


Si su cp tiene un indicador "-t" (verifique la página del manual), eso simplifica un poco las cosas:

ls -SF | grep -v / | head -5 | xargs cp -t DIRECTORY

El comando Encontrar le brinda una capacidad más precisa para obtener lo que desea, en lugar de ls | grep ls | grep que tienes. Yo codificaría tu pregunta de esta manera:

find . -maxdepth 1 -type f -printf "%p\t%s\n" | 
sort -t $'\t' -k2 -nr | 
head -n 5 | 
cut -f 1 | 
xargs echo cp -t DIRECTORY

Yo lo haría:

cp $(ls -SF | grep -v / | head -5) Directory

Sin embargo, xargs probablemente sería la mejor respuesta.

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory




cp