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?


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.


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


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.