web-dev-qa-db-fra.com

Comment puis-je piloter le résultat de la commande WC dans une expansion arithmétique?

Je veux courir wc -l et utiliser le résultat dans une expansion arithmétique. En d'autres termes, je veux faire quelque chose comme ça:

wc -l (now somehow pipe/pass the result of this to) $((2 + result of wc command))

Comment puis-je faire ceci?

Le contexte

Dans mon ~/Pictures répertoire, j'ai plusieurs fichiers nommés "Screenshot from YYYY-MM-DD hh-mm-ss.png ", ainsi que d'autres fichiers. Je veux conserver tous les fichiers qui ne sont pas des captures d'écran, et seulement un nombre spécifié d'images de capture d'écran, en fonction de la récente, ils étaient récents. Je veux fondamentalement seulement les 3 dernières captures à captures les plus récentes que je avoir et supprimer tout le reste.

Voici donc ce que j'ai jusqu'à présent:

ls | grep "Screenshot *" | sort -r | wc -l

Ce que j'ai voulu alors faire était de soustraire 3 de wc -l, qui me permettrait alors d'utiliser tail pour répertorier tous les fichiers qui ne sont pas les 3 premiers, puis simplement les supprimer.

3

Pour ce que vous demandez ( source ):

cat FILE | wc -l | xargs -n 1 bash -c 'echo $(($1 + 2))' args

bash -c 'commands' Exécuter un nouvel environnement Bash, où $1 est un argument donné par xargs. Utilisation man the_commmand Pour accéder à des pages manuelles et en savoir plus sur chaque commande et leurs options.

De man bash :

[~ # ~] Synopsis [~ # ~]
[.____] xargs [options] [command [initial-arguments]]

[~ # ~] options [~ # ~ # ~]
[.____] -c Si la -c Option est présente, alors les commandes sont lues à partir du premier argument non option Command_String. S'il y a des arguments après le Command_string, le premier argument est attribué à 0 $ et tous les arguments restants sont attribués aux paramètres de position . L'affectation à $ 0 définit le nom de la coquille, qui est utilisé dans des messages d'avertissement et d'erreur.

$ bash -c 'echo $1' aaa bbb ccc
bbb
$ bash -c 'echo $0' aaa bbb ccc
aaa
$ echo $0
/bin/bash

Donc Dans ce cas , vous pouvez éviter d'utiliser l'espace réservé args (Remarque Vous pouvez utiliser n'importe quel mot) à l'aide de $ 0 à la place. Aussi, pour juste onw wc -l vous pouvez éviter le -n 1:

cat FILE | wc -l | xargs bash -c 'echo $(($0 + 2))'

Pour ce dont vous avez besoin pourrait être plus approprié pour supprimer de manière interactive (-i) Les dossiers plus âgés de plus de 20 jours.

find ~/Pictures/ -type f -name "Screenshot*" -mtime +20 -exec rm -i {} +

Pour obtenir les 3 nouveaux fichiers, par exemple, le modèle de nom est plus simple:

ls -lt ~/Pictures/Screenshot* | head -n 3
1
Pablo Bianchi