web-dev-qa-db-fra.com

passer la sortie comme argument pour cp dans bash

Je prends une classe unix/linux et nous n'avons pas encore appris les variables ou les fonctions. Nous venons d'apprendre quelques utilitaires de base comme l'indicateur et le pipeline, la sortie et l'ajout au fichier. Sur la mission de laboratoire, il veut que nous trouvions les plus gros fichiers et les copions dans un répertoire.

Je peux obtenir les 5 plus gros fichiers mais je ne sais pas comment les passer dans cp en une seule commande

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

Ce serait:

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

en supposant que le pipeline est correct. Les backticks remplacent dans la ligne la sortie des commandes à l'intérieur.

Vous pouvez également faire vos tests:

cp `echo a b c` Directory

copiera tous les a, b et c dans Directory.

58
Diego Sevilla

Je ferais:

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

xargs serait probablement la meilleure réponse.

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

Utilisez des backticks `comme ceci 'ou le signe dollar $ (comme celui-ci) pour effectuer la substitution de commande. Fondamentalement, cela colle chaque ligne de sortie standard de la commande backticked dans la commande environnante et l'exécute. Pour en savoir plus, consultez la page de manuel bash sous "Substitution de commandes".

De plus, si vous souhaitez lire une ligne à la fois, vous pouvez lire des lignes individuelles dans un flux de tuyau en utilisant la syntaxe "en lecture":

ls | while read varname; do echo $varname; done
6
Brian Gordon

Si votre cp a un drapeau "-t" (consultez la page de manuel), cela simplifie un peu les choses:

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

La commande find vous donne une capacité plus fine pour obtenir ce que vous voulez, au lieu de ls | grep que vous avez. Je coderais votre question comme ceci:

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
glenn jackman