Listen Sie alle Dateien in einem Verzeichnis rekursiv auf, schließen Sie jedoch die Verzeichnisse selbst aus

8

Einfache Frage, ich führe den folgenden Suchbefehl aus:

find . -type d \( -path ./.git -o   \
                  -path ./log -o    \
                  -path ./public -o \
                  -path ./tmp       \) \
                  -prune -o         \
                  -print

Zum Auflisten aller Dateien in meinem Verzeichnis mit Ausnahme der angegebenen Verzeichnisse.

Dies funktioniert jedoch hervorragend. Ich möchte jedoch auch alle tatsächlichen Verzeichnisse von der Ausgabe ausschließen. Wenn also eine Verzeichnisstruktur wie folgt vorhanden ist:

test
  -- foo.text
  -- bar.text

Wenn ich meinen Befehl ausführe, würde ich gerne sehen:

./test/foo.text
./test/bar.text

anstatt:

.
./test
./test/foo.text
./test/bar.text

Kann jemand helfen?

TheDelChop
quelle
Titel stimmt nicht mit Inhalt überein.
Strg-Alt-Delor

Antworten:

10
find . -type f

werde es tun. Sie können exec ausführen, wenn Sie Dateinamen bearbeiten möchten.

unxnut
quelle
Ja, aber ich muss alle Dateien unter bestimmten Verzeichnissen ausschließen.
TheDelChop
-type fist für reguläre Dateien. Verzeichnisse und reguläre Dateien sind zwei von vielen verschiedenen Dateitypen unter Unix. Mit schließen -type fSie Verzeichnisse aus, aber auch alle anderen Dateitypen wie Symlinks, Sockets, Fifos, Geräte, Türen ...
Stéphane Chazelas
@ StéphaneChazelas, Türen ?
user1717828
@ user1717828, en.wikipedia.org/wiki/Doors_%28computing%29
Stéphane Chazelas
6

Verwenden Sie einfach ! -type d:

find . -type d \( -path ./.git -o \
                  -path ./log -o \
                  -path ./public -o \
                  -path ./tmp \) -prune -o \
       ! -type d -print
Stéphane Chazelas
quelle
0

Hier ist eine Möglichkeit, dies zu tun. Ich leite deine Ausgabe von find(using xargs) an ein bisschen Bash weiter, was die Frage stellt: "Ist das kein Verzeichnis?" Wenn dies nicht der Fall ist, wird es an Ihr Terminal weitergeleitet.

Hier ist die ganze She-Bang:

find . -type d \( -path ./.git -o -path ./log -o -path ./public -o -path ./tmp \) -prune -o -print | xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Hier ist nur meine Ergänzung:

xargs -i bash -c 'if [ ! -d "{}" ]; then echo "{}"; fi'

Erklären:

xargs -i Ersetzen Sie die Zeichenfolge "{}" durch Argumente (die eingespeist werden).

bash -c Befehle aus Zeichenfolge lesen

if [ ! -d "{}"]; Ist das ein Verzeichnis?

echo "{}" Echo das Suchergebnis.

fi; beenden, wenn.

dougBTV
quelle
Dort verwandeln Sie den Dateinamen in Shell-Code. Typischer Eskalationspfad für Berechtigungen. Da kann man eine Datei erstellen, die $(do-what-I-want)zum Beispiel aufgerufen wird , damit Sie tun, was er will.
Stéphane Chazelas