pase la salida como argumento para cp en bash [duplicate]


Esta pregunta ya tiene una respuesta aquí:

Estoy tomando una clase unix/linux y todavía tenemos que aprender variables o funciones. Acabamos de aprender algunas utilidades básicas como la bandera y la canalización, salida y anexar a archivo. En la asignación de laboratorio quiere que encontremos el archivos más grandes y copiarlos en un directorio.

Puedo obtener los 5 archivos más grandes pero no se como pasarlos a cp en un comando

ls -SF | grep -v / | head -5 | cp ? Directory
Author: Yamiko, 2011-07-26

4 answers

Sería:

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

Asumiendo que la canalización es correcta. Las comillas simples inclinadas sustituir en la línea de la salida de los comandos dentro de ella.

También puedes hacer tus pruebas:

cp `echo a b c` Directory

Copiará todo a, b, y c en Directory.

 49
Author: Diego Sevilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 16:49:27

Yo haría:

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

Xargs probablemente sería la mejor respuesta.

ls -SF | grep -v / | head -5 | xargs -I{} cp "{}" Directory
 27
Author: gpojd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 16:54:16

Utilice los backsticks `like this` o el signo de dólar $(like this) para realizar la sustitución de comandos. Básicamente, esto pega cada línea de salida estándar del comando backticked en el comando circundante y lo ejecuta. Obtenga más información en la página de manual de bash en " Sustitución de órdenes."

Además, si desea leer una línea a la vez, puede leer líneas individuales de un flujo de tubería utilizando la sintaxis "while read":

ls | while read varname; do echo $varname; done
 5
Author: Brian Gordon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 16:57:10

Si su cp tiene una bandera "- t " (revise la página de manual), eso simplifica un poco las cosas:

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

El comando find le da más capacidad de grano fino para obtener lo que desea, en lugar de ls | grep que tiene. Codificaría tu pregunta así:

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
 0
Author: glenn jackman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-26 17:15:19