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