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.


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 .


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.


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

5

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

ls -la | grep -E '^[^d]' > files

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,^./,,

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.


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
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.