HP-UX ***** B.11.23 U Licence utilisateur illimité **** ia64 ****
find . -type d -name *log* | xargs ls -la
me donne les noms de répertoires (ceux qui contiennent log
le nom du répertoire) suivis de tous les fichiers de ce répertoire.
Les répertoires /var/opt/SID/application_a/log/
, /var/opt/SID/application_b/log/
, /var/opt/SID/application_c/log/
etc. contiennent des fichiers journaux.
Je veux que seuls les deux derniers fichiers de log soient listés par la ls
commande, ce que je trouve habituellement avec ls -latr | tail -2
.
La sortie doit être quelque chose comme ça ..
/var/opt/SID/application_a/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1
-rw-rw-rw- 1 user1 user1 59698 Jun 10 2013 log2
find . -type d -name *log* | xargs ls -la | tail -2
ne me donne pas le résultat ci-dessus. Ce que je reçois est une liste des deux derniers fichiers de
find . -type d -name *log* | xargs ls -la
commande.
Alors, puis-je diriger les commandes après une passe xargs
? Sinon, comment interroger, pour obtenir la liste résultante des fichiers dans le format ci-dessus?
find . -type d -name *log* | xargs sh -c "ls -ltr | tail -10"
me donne une liste de dix noms de répertoire dans le répertoire actuel, ce /var/opt/SID
qui n’est pas ce que je veux.
*log*
cas contraire, le shell le développera.sh -c
le nom de la commande (paramètre 0) est attendu comme second argument. Vous devez donc toujours le fairefind . -type d -name *log* | xargs sh -c "ls -ltr | tail -10" lstail
(remarquez-lelstail
à la fin, qui servira comme$0
pour le shell créé). Sinon, le premier de vos résultats remplira ce rôle et restera inutilisé.Réponses:
Tu es presque là. Dans votre dernière commande, vous pouvez utiliser
-I
pour faire lels
bonDonc avec
vous allez
echo
trouver le répertoire trouvéfind
, puis faites-ls | tail
le dessus.la source
xargs -n 1 sh -c 'echo $0'
echo $0
était donc utile (et plus compréhensible)-print0
,xargs -0
et échapper{}
à des guillemets doubles à l' intérieur de lash
commande:find . -type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"
GNU Parallel facilite ce genre de tâches:
Si vous ne souhaitez pas effectuer une installation complète de GNU Parallel, vous pouvez effectuer une installation minimale: http://git.savannah.gnu.org/cgit/parallel.git/tree/README
la source
Juste en plus de fredtantini et à titre de clarification générale (car les documents sont un peu déroutants):
Le
xargs -I {}
prendra les caractères '{}' de l'entrée standard et les remplacera par tout ce qui sortira du tube. Cela signifie que vous pouvez remplacer{}
n'importe quelle combinaison de caractères (peut-être pour mieux adapter votre style de programmation préféré). Par exemple :xargs -I % sh -c "echo %"
. Si vous utilisez toujours le,xargs -I {}
vous pouvez le remplacer par unxargs -i
raccourci.Le
sh -c
va dire à votre bash / shell de lire la prochaine commande à partir d’une chaîne et non de l’entrée standard. Donc, écriresh -c "echo something"
est équivalent àecho something
.La
xargs -I {} sh -c "echo {}"
lira l'entrée vous avez créé avec cesh -c
qui estecho {}
. Depuis que vous lui avez dit de remplacer{}
par les arguments du tuyau, c'est ce qui va arriver.Vous pouvez facilement tester cela même sans tuyauterie, il vous suffit de taper la commande ci-dessus dans un terminal. Tout ce que vous écrivez ensuite sera envoyé au terminal (Ctrl-D pour sortir).
Dans la
ls -la {}
commande, la même chose se reproduit. Le{}
est remplacé par le contenu de la commande de pré-pipe.la source