it-swarm.com.de

ls Befehl: Wie kann ich eine rekursive vollständige Pfadauflistung erhalten, eine Zeile pro Datei?

Wie kann ich ls dazu bringen, eine flache Liste von rekursiven Pfaden pro Zeile auszuspucken?

Zum Beispiel möchte ich nur eine flache Auflistung der Dateien mit ihren vollständigen Pfaden:

/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow
/home/dreftymac/stackoverflow/alpha.txt
/home/dreftymac/stackoverflow/bravo.txt
/home/dreftymac/stackoverflow/charlie.txt

ls -a1 macht fast das, was ich brauche, aber ich will keine Pfadfragmente, ich will volle Pfade.

436
dreftymac

Wenn Sie wirklich ls verwenden möchten, formatieren Sie die Ausgabe mit awk:

ls -R /path | awk '
/:$/&&f{s=$0;f=0}
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}
NF&&f{ print s"/"$0 }'
355
ghostdog74

Verwenden Sie find:

find .
find /home/dreftymac

Wenn Sie nur Dateien möchten (Verzeichnisse, Geräte usw. weglassen):

find . -type f
find /home/dreftymac -type f
511
stefanB

ls -ld $(find .)

wenn Sie Ihre Ausgabe nach Änderungszeit sortieren möchten:

ls -ltd $(find .)

71
others

Versuchen Sie es auf einfachere Weise:

find "$PWD"
53
Ivan Alegre

Bester Befehl ist: tree -fi

Um die Dateien, aber nicht die Links zu verwenden, müssen Sie > aus Ihrer Ausgabe entfernen:

tree -fi |grep -v \>

Wenn Sie die Art jeder Datei kennen möchten, (um beispielsweise nur ASCII Dateien zu lesen) mit zwei whiles:

tree -fi | \
grep -v \> | \
while read first ; do 
    file ${first}
done | \
while read second; do 
    echo ${second} | grep ASCII
done
41
kerkael

Oh, wirklich eine lange Liste von Antworten. Es hat mir sehr geholfen und schließlich habe ich mein eigenes erstellt, nach dem ich gesucht habe:

So listen Sie alle Dateien in einem Verzeichnis und seinen Unterverzeichnissen auf:

find "$PWD" -type f

So listen Sie alle Verzeichnisse in einem Verzeichnis und seinen Unterverzeichnissen auf:

find "$PWD" -type d

So listen Sie alle Verzeichnisse und Dateien in einem Verzeichnis und seinen Unterverzeichnissen auf:

find "$PWD"
38
Godfather

Ich kenne den vollständigen Pfad nicht, aber Sie können -R für die Rekursion verwenden. Wenn Sie sich nicht für ls interessieren, können Sie auch find * ausführen.

18
Justin Johnson

Verwenden Sie keine anderen externen Befehle als ls:

ls -R1 /path | 
  while read l; do case $l in *:) d=${l%:};; "") d=;; *) echo "$d/$l";; esac; done
16
Idelic
du -a

Praktisch für einige eingeschränkte Appliance-Shells, bei denen find/locate nicht verfügbar ist.

13
Rob D

finde/werde den Trick machen

12
Dmitry

Ich denke für eine flache Liste ist der beste Weg:

find -D tree /fullpath/to-dir/ 

(oder um es in einer txt-Datei zu speichern)

find -D tree /fullpath/to-dir/ > file.txt
9
Dimitrios

Der einfachste Weg für alle zukünftigen Menschen ist einfach:

du

Dies zeigt jedoch auch die Größe des Inhalts jedes Ordners. Sie können awk verwenden, um nur den Ordnernamen auszugeben:

du | awk '{print $2}'

Bearbeiten- Entschuldigung, mein Schlechtes. Ich dachte, es würden nur Ordner benötigt. Ich lasse das hier für den Fall, dass es irgendjemand in der Zukunft braucht ...

8
6112115

Mit der Freiheit, alle möglichen ls-Optionen zu nutzen:

find -type f | xargs ls -1

7

Mach es nicht kompliziert. Ich habe das gerade benutzt und eine schöne Ausgabe bekommen:

ls -lR /path/I/need
7
KellyC

Hier ist eine Teilantwort, die die Verzeichnisnamen zeigt.

ls -mR * | sed -n 's/://p'

Erläuterung:

ls -mR * listet die vollständigen Verzeichnisnamen auf, die mit einem ':' enden, und listet dann die Dateien in diesem Verzeichnis separat auf

sed -n 's/://p' findet Zeilen, die mit einem Doppelpunkt enden, entfernt den Doppelpunkt und druckt die Zeile aus

Wenn Sie die Liste der Verzeichnisse durchlaufen, sollten Sie auch in der Lage sein, die Verzeichnisse zu finden. Arbeite immer noch daran. Es ist eine Herausforderung, die Platzhalter durch xargs zu bekommen.

6
Kevin

Führen Sie einen Bash-Befehl im folgenden Format aus:

find /path -type f -exec ls -l \{\} \;
6
Denio Mariz

Durch Hinzufügen eines Platzhalters am Ende eines ls-Verzeichnisses werden vollständige Pfade erzwungen. Im Moment haben Sie Folgendes:

$ ls /home/dreftymac/
foo.txt
bar.txt
stackoverflow
stackoverflow/alpha.txt
stackoverflow/bravo.txt
stackoverflow/charlie.txt

Sie könnten dies stattdessen tun:

$ ls /home/dreftymac/*
/home/dreftymac/.
/home/dreftymac/foo.txt
/home/dreftymac/bar.txt
/home/dreftymac/stackoverflow:
alpha.txt
bravo.txt
charlie.txt

Leider gibt dies nicht den vollständigen Pfad für Verzeichnisse aus, in die rekursiv verwiesen wird. Daher ist dies möglicherweise nicht die vollständige Lösung, nach der Sie suchen.

5
koeselitz

ls -lR ist das, wonach du gesucht hast, oder zumindest, was ich war. Prost

5
sivi

Viele Antworten sehe ich. Dies ist meins und ich finde es sehr nützlich, wenn Sie auf einem Mac arbeiten.

Ich bin sicher, Sie wissen, dass es einige "Bundle" -Dateien gibt (. App, . Rtfd, . Workflow und so weiter). Und im Finder-Fenster erscheinen sie als einzelne Dateien. Aber das sind sie nicht. Und $ ls oder $ find sehen sie als Verzeichnisse ... Wenn Sie nicht auch deren Inhalt auflisten müssen, funktioniert dies für mich:

find . -not -name ".*" -not -name "." | egrep -v "\.rtfd/|\.app/|\.lpdf/|\.workflow/"

Natürlich ist dies für das Arbeitsverzeichnis, und Sie können die Erweiterungen anderer Bundles hinzufügen (aber immer mit einem / nach ihnen). Oder andere Erweiterungen, wenn nicht Bundles ohne den /.

Ziemlich interessant das ".lpdf/" (mehrsprachiges pdf). Es hat die normale Erweiterung ".pdf" (!!) oder keine im Finder. Auf diese Weise erhalten Sie (oder es zählt nur 1 Datei) für dieses pdf und nicht für ein paar Sachen…

4
Steve

Wenn das Verzeichnis als relativer Pfad übergeben wird und Sie es in einen absoluten Pfad konvertieren müssen, bevor Sie find aufrufen. Im folgenden Beispiel wird das Verzeichnis als erster Parameter an das Skript übergeben:

#!/bin/bash

# get absolute path
directory=`cd $1; pwd`
# print out list of files and directories
find $directory
3
John Keyes
tar cf - $PWD|tar tvf -             

Dies ist langsam, funktioniert jedoch rekursiv und druckt sowohl Verzeichnisse als auch Dateien. Sie können es mit awk/grep weiterleiten, wenn Sie nur die Dateinamen ohne alle anderen info/-Verzeichnisse wollen:

tar cf - $PWD|tar tvf -|awk '{print $6}'|grep -v "/$"          
3
RuleB

@ ghostdog74: Little Tweak mit deiner Lösung.
Der folgende Code kann zum Durchsuchen der Datei mit ihrem vollständigen absoluten Pfad verwendet werden.

Sudo ls -R / | awk '<br/>
/:$/&&f{s=$0;f=0}<br/>
/:$/&&!f{sub(/:$/,"");s=$0;f=1;next}<br/>
NF&&f{ print s"/"$0 }' | grep [file_to_search]
2
Chaitanya

Ich kannte den Dateinamen, wollte aber auch das Verzeichnis.

finde $ PWD | fgrep Dateiname

hat unter Mac OS 10.12.1 einwandfrei funktioniert

1
hpj