Auflisten von Dateien in einem Verzeichnis ohne Auflisten von Unterverzeichnissen und deren Inhalt in diesem Verzeichnis

24

Ich möchte eine Liste aller Dateien in einem Verzeichnis erstellen, ohne eines der Unterverzeichnisse aufzulisten, die sich in demselben Verzeichnis befinden, und diese Liste in einer neuen Datei ausdrucken.

ls -d * > filelist

erstellt eine Liste aller Dateien im aktuellen Verzeichnis, listet jedoch auch die Unterverzeichnisse im aktuellen Verzeichnis auf. Ich habe den findBefehl mit der -maxdepth 1Option ausprobiert - das Ausgabeformat ist jedoch ein Problem, da find auch den Pfad zusammen mit den Dateinamen ausgibt.

Wenn jemand mir bitte einen anderen Befehl oder andere Optionen mitteilen kann, die eine Ausgabeliste nur der Dateien in einem Verzeichnis und nicht der Namen der Unterverzeichnisse oder ihres Inhalts erzeugen, würde ich es begrüßen.

janet
quelle
2
Ich bin verwirrt ls -d *, liste hier nur die Dateien und Ordner im aktuellen Ordner auf, ausgenommen versteckte Dateien / Ordner.
GM-Script-Writer-62850
Ja, aber ich möchte nicht, dass die Ordner in diesem Verzeichnis aufgelistet werden, sondern nur, dass die Dateien in diesem Verzeichnis aufgelistet werden
Janet

Antworten:

22

Auf der Suche basierende Lösung:

find . -maxdepth 1 -type f -printf '%f\n'

Bash-basierte Lösung:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Mit der bash-basierten Lösung erhalten Sie alles, was kein Verzeichnis ist. Es wird Dinge wie Named Pipes enthalten (das möchten Sie wahrscheinlich). Wenn Sie speziell nur Dateien möchten , verwenden Sie entweder den findBefehl oder einen der folgenden Befehle:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Wenn Sie dies regelmäßig verwenden, können Sie dies natürlich in einen Alias ​​an einer beliebigen Stelle in Ihrem ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Da Sie in den Kommentaren festgestellt haben, dass Sie sich tatsächlich unter OSX und nicht unter Ubuntu befinden, empfehle ich Ihnen, beim nächsten Mal Fragen an die Apple- oder allgemeineren Unix- und Linux- Stack-Exchange-Sites zu richten .

Übelsuppe
quelle
1
Stellen Sie sicher, dass diese Lösungen für Sie korrekt sind, basierend darauf, ob Sie versteckte Dateien einschließen möchten oder nicht.
Kevin Wheeler
10

Nur Dateinamen auflisten:

1. ls -p | grep -v / (ohne versteckte Dateien)
 2. ls -l | grep ^ - | tr -s '' | cut -d '' -f 9 (ohne versteckte Dateien)

 a) ls -pa | grep -v / (mit versteckten Dateien)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (mit versteckten Dateien)

Nur Verzeichnisse auflisten:

1. ls -p | grep / (ohne versteckt)
 2. ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (ohne versteckte)

 a) ls -pa | grep / (mit verstecktem)
 b) ls -l | grep ^ d | tr -s '' | cut -d '' -f 9 (mit verstecktem)

grep -v -e ^ $ entfernt leere Zeilen aus dem Ergebnis.

Weitere Details :
ls -p-Flag setzt '/' am Ende des Verzeichnisnamens, -R-Flag für die rekursive Suche, -l für die Auflistung mit Informationen, -a für die Auflistung aller (einschließlich versteckter Dateien) mit Informationen, grep -v Flag ist für die Ergebnisinvertierung und -e Flag für die Regex-Übereinstimmung.

Ananda
quelle
7

So listen Sie nur reguläre Dateien auf:

ls -al | grep ^-

Mit symbolischen Links enthalten:

ls -al | grep ^[-l]

Wo das erste Zeichen der Liste den Dateityp beschreibt, -bedeutet dies, dass es sich um eine reguläre Datei handelt, für die eine symbolische Verknüpfung besteht l.

Debian / Ubuntu

Geben Sie die Namen aller übereinstimmenden Dateien (einschließlich Links) aus:

run-parts --list --regex . .

Mit absoluten Pfaden:

run-parts --list --regex . $PWD

Drucken Sie die Namen aller Dateien /etc, die mit beginnen pund mit enden d:

run-parts --list --regex '^p.*d$' /etc
Kenorb
quelle
5

Noch eine andere Lösung, eine naiv kurze, die für mich funktioniert hat:

ls -la | grep -E '^[^d]' > files
arsaKasra
quelle
perfekt für mich,ls -alR |grep -E '^-'
hier
4

Ich würde vorschlagen, find zu verwenden und bei Bedarf den Verzeichnisnamen aus der Ausgabe zu entfernen:

find . -type f -maxdepth 1 | sed s,^./,,
Puma
quelle
2
-maxdepth 1sollte vor allen Filtern stehen, und Sie können dieses Ergebnis erzielen, ohne seddie -printfOption zu verwenden, dh: find . -maxdepth 1 -type f -printf '%f\n'(Dies ist effizienter als die Verwendung eines zusätzlichen Programms).
Evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Eine andere mögliche Option ist

ls -F | grep -v '/' | sed /[@*]$// > filelist

Das --file-typesetzt ein / am Ende der Ordner (aber auch ein @ am Ende der symbolischen Links. The grep -v '/'Entfernt die Unterverzeichnisse (weil sie jetzt mit einem '/' enden). Das sed s/@$//entfernt das @. Das -1 gibt eine Datei pro Zeile aus damit das grep -v richtig funktioniert.

Dr.Tower
quelle
danke für Ihre Antwort. Leider funktioniert es nicht für mich, vielleicht führe ich es falsch aus. Wenn ich den genauen Befehl verwende, den Sie mir gegeben haben, erhalte ich den folgenden Fehler: ls: unzulässige Option - - Verwendung: ls Verbindung mit --file-type. wenn Sie klarstellen könnten, würde ich es schätzen!
Janet
Der Befehl funktioniert bei mir (mit 13.04). Welche Ubuntu-Version verwenden Sie ?; -1Es spielt keine Rolle, ob Sie es brauchen oder nicht. Wenn Sie versteckte Dateien -als
einbinden
Eigentlich arbeite ich an einem Mac. vielleicht ist der befehl auf mac os x oder unix etwas anders?
Janet
1
Sie könnten auch versuchenls -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower