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
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
.
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
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
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
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