43 votes

passer la sortie comme argument pour cp dans bash

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

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

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

74voto

Diego Sevilla Points 17274

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 qu'elle contient.

Vous pouvez également faire vos tests :

 cp `echo a b c` Directory

copiera tous les a , b et c dans Directory .

49voto

gpojd Points 12043

Je ferais:

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

xargs serait probablement la meilleure réponse cependant.

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

7voto

Brian Gordon Points 2551

Utilisez des backticks "comme ceci" ou le signe dollar $ (comme ceci) pour effectuer une 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 d'un flux de tuyaux en utilisant la syntaxe "pendant la lecture":

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

0voto

glenn jackman Points 69748

Si votre cp a un indicateur "-t" (vérifiez 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 précise pour obtenir ce que vous voulez, au lieu de ls | grep que vous avez. Je coderais ta 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X