2016-04-21 3 views
2

Ich brauche das nicht in einer Zeile, aber ich habe bisher nur eine Zeile.Bash - Auflistung von Programmen in allen Unterverzeichnissen mit dem Verzeichnisnamen vor der Datei

find . -perm -111 +type f | sort -r 

Was ich versuche, ein Bash-Skript zu tun ist, schreiben, die eine Liste aller Dateien im aktuellen Verzeichnis angezeigt werden, die (auf einem z) ausführbar sind. Ich möchte, dass das Skript für alle Unterverzeichnisse dasselbe tut. Ich habe Schwierigkeiten, den Namen des Unterverzeichnisses vor der Liste der ausführbaren Dateien in diesem Verzeichnis/Unterverzeichnis anzuzeigen.

Also, um zu klären, wünschenswert Ausgabe könnte wie folgt aussehen:

program1 
program2 
SubDir1 
program3 
SubDirSubDir2 
program4 
SubDir2 
program5 

Was ich jetzt haben (der obige Code) dies tut. Der Pfad wird nicht entfernt und der Name des neuen Verzeichnisses wird nicht angezeigt, wenn Verzeichnisse geändert werden.

./exfile 
./test/exfile1 
./test1/program2 
./test1/program 
./first 

Hoffentlich war das klar.

+0

Haben Sie bedeuten, dass für jedes Verzeichnis, das Sie alle Verzeichnisse angezeigt werden sollen zuerst, gefolgt von den Dateien? Welche Reihenfolge möchten Sie die Verzeichnisse zu folgen? – paddy

+0

um zu klären, ich möchte die ausführbare Datei drucken Programme im aktuellen Verzeichnis und dann den Namen des ersten Unterdires ctory und listet jedes Programm darunter auf. Und dann tun Sie es für alle Unterverzeichnisse (rekursiv). – jonbon

+0

@paddy hat dem ursprünglichen Beitrag neue Informationen hinzugefügt – jonbon

Antwort

1

Dies wird funktionieren.

Ich änderte die Erlaubnis zu -100, weil vielleicht einige Programme nur durch seinen Inhaber ausführbar sind.

for d in $(find . -type d); do 
    echo "in $d:" 
    find $d -maxdepth 1 -perm -100 -type f | sed 's#.*/##' 
done 
0

Dies wird den Trick für Sie tun.

find . -type d | sort | xargs -n1 -I{} bash -c "find {} -type f -maxdepth 1 -executable | sort -r" 

Der erste Suchbefehl listet alle Verzeichnisse und Unterverzeichnisse auf und sortiert sie in aufsteigender Reihenfolge.

Die sortierten Verzeichnisse/Unterverzeichnisse werden dann an xargs übergeben, die bash aufruft, um die Dateien im Verzeichnis/Unterverzeichnis zu finden und sie in absteigender Reihenfolge zu sortieren. Wenn Sie es vorziehen, das Verzeichnis auch zu drucken, können Sie es ohne -type f ausführen.

0

Sie können find auf alle Verzeichnisse verwenden und es mit -print kombinieren (den Verzeichnisnamen drucken) und -exec (eine Suche nach Dateien in diesem Verzeichnis auszuführen):

find . -type d -print -exec bash -c 'find {} -type f -depth 1 -perm +0111 | sort -r' \; 

ist dies Lassen brechen. Zuerst müssen Sie das Verzeichnis suchen:

find . -type d -print 

Dann wird der Befehl für jedes Verzeichnis auszuführen:

find {} -type f -depth 1 -perm +0111 | sort -r 

Der -exec Schalter wird den Pfad erweitern, wo es {} sieht. Da dies einen Pipe-Operator verwendet, der Shell-Syntax ist, ist das Ganze in bash -c verpackt.

Sie können dies weiter ausbauen. Wenn Sie die Verzeichnisnamen aus den Dateien und Platz, um unsere Ergebnisse in schöner, so etwas wie dies könnte entfernt werden sollen genügen:

find {} -type f -depth 1 -print0 -perm +0111 | xargs -n1 -0 basename | sort -r && echo 
0

Hmm, die Sortier Anforderung macht diese tricky - die „für d in $ (finden .. ..?)“Befehl klug ist, aber schwer die Sortierung zu steuern Wie über dieses Alles ist z-> a, die Verzeichnisse, einschließlich, aber die awk-Anweisung ist ein bisschen wie ein Monster; _)

find `pwd` -perm 111 -type f | sort -r | xargs -n1 -I{} sh -c "dirname {};basename {}" | awk '/^\// {dir=$0 ; if (dir != lastdir) {print;lastdir=dir}} !/^\// {print}'

erzeugt

/home/imcgowan/t/t3 jjj iii hhh /home/imcgowan/t/t2 ggg fff eee /home/imcgowan/t/t1 ddd ccc bbb /home/imcgowan/t aaa

Verwandte Themen