2011-07-26 29 views
22

Estoy tomando una clase unix/linux y aún tenemos que aprender variables o funciones. Acabamos de aprender algunas utilidades básicas, como la bandera y la tubería, salida y anexar al archivo. En la tarea del laboratorio, él quiere que busquemos los archivos más grandes y los copiemos en un directorio.pase la salida como un argumento para cp en bash

puedo conseguir los 5 archivos más grandes, pero no sé cómo pasar ellos en cp en un comando

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

'hombre xargs' es su amigo ... –

+0

Véase también [Cómo pasar' 'resultados find' a cp' de tal manera que los nombres de archivo con espacios de trabajo] (http : //stackoverflow.com/questions/18724826/how-to-pass-find-results-to-cp-such-that-file-names-with-spaces-work). – tripleee

Respuesta

46

Sería:

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

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

También puede hacer sus pruebas:

cp `echo a b c` Directory 

copiará todos a, b, y en cDirectory.

25

que haría:

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

xargs probablemente sería la mejor respuesta, aunque.

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

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

Además, si quieres leer una línea a la vez que puede leer las líneas individuales de cada una corriente tubería usando "mientras que leer" sintaxis:

ls | while read varname; do echo $varname; done 
+0

Eso es exactamente lo que necesitaba para canalizar una lista de identificadores de ventanas (descomprimidos y recortados de la salida de 'xwininfo') en' xdotool' para poder cerrar un grupo de cuadros de diálogo de error que aparecían. Esta sintaxis funciona con zsh :) – Desty

0

Si su cp tiene una bandera "-t" (consulte la página de hombre), que simplifica las cosas un poco:

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

el comando find le da la capacidad de grano más fino para obtener lo que desea, en lugar de ls | grep que tiene. Me código del teléfono pregunta como esta:

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

Revisé la página del manual en mi sistema (macOS 10.12.1), y la opción -t no parece existir: '~ $ cp -t main.c main2.c cp : opción ilegal - t' –

+1

Creo que -t es una opción de GNU y Mac no es GNU. –

Cuestiones relacionadas