2017-07-08 3 views
0

Comment imprimer uniquement le (s) dernier (x) fichier (s) dans les répertoires imbriqués correspondant à un certain modèle?Terminez plusieurs répertoires

Faire

ls -l dir*/history/ | tail 

donne seulement le contenu du dernier répertoire.

Je soupçonne que cela a à voir avec xargs mais je n'arrive pas vraiment à comprendre comment.

+0

Voulez-vous imprimer 10 fichiers par répertoire, ou en général? – randomir

+0

Il serait utile de savoir quel type de * "certain pattern" * vous devez trouver pour savoir si * globbing * ou * regex matching * est nécessaire. –

+0

Je pense avoir compris votre besoin finalement. Essayez l'exemple. – hedgar2017

Répondre

1

Pour répondre à votre question directement, utilisez la boucle:

for d in dir*/history/; do 
    ls -l "$d" | tail 
done 

Mais, pour plus advanced "filtrage" (et le traitement) que cela, find pourrait être utile.

+0

Cela fonctionne bien que j'espérais un oneliner ... – Manfredo

+0

Mettez tout sur une ligne, par exemple. 'pour d dans dir *; faire ls -l "$ d" | queue; done' –

1

Essayez que:

find . -type d -name "dir*" | while read dir; do find "$dir" | tail -n 5; done 

Pas très laconique, mais si vous devez correspondre à tous les niveaux de répertoires imbriqués et choisissez N fichiers de chaque sous-répertoire ...
ajouter également 2>/dev/null avant chaque canal pour supprimer les messages 'permission denied'. Ou utilisez sudo.
Un équivalent avec la substitution de processus, si vous avez besoin de changer les variables globales dans la boucle while:

while read dir; do find "$dir" | tail -n 5; done < <(find . -type d -name "dir*") 
+0

L'ajout d'un modèle ''name '' aiderait la réponse à mieux répondre à la question mise à jour. Vous devrez également ajouter un 'sort' car' find' ne conserve pas l'ordre de tri canonique. –

+0

J'ai modifié le post pour ajouter que mon modèle dir est imbriqué. Votre exemple ne fonctionne pas vraiment (pas sûr que c'est pour ça). – Manfredo

+0

Il va, je soupçonne une modification arrive. –