Ich habe ein Verzeichnis namens uploads
. Es enthält eine Reihe von Dateien sowie einige Unterverzeichnisse, die wiederum Dateien enthalten.
Gibt es eine Möglichkeit, wie ich (in einem Schritt) Folgendes tun kann:
NUR die Dateien im Stammverzeichnis für Uploads auflisten - Ich möchte die Namen der Unterordner oder deren Inhalt nicht sehen.
und
Listen Sie KEINE Dateien auf, die mit beginnen
t_
Ich weiß über die -d
Flagge Bescheid , aber sie bringt mir nicht das, was ich will.
-exec ls -lG -- {} +
in seiner Antwort die Verwendung von ls, um die Ausgabe mit zusätzlichen Optionen zu erhalten. Sie können-ls
diesem Fund auch nur einen hinzufügen , um eine schnelle und unsaubere Annäherung an die Detailansicht von ls zu erhalten.GNU ls (dh der Befehl ls auf nicht eingebetteten Linux-Systemen und Cygwin, der auch auf einigen anderen Unices verfügbar ist) bietet die Option, einige Dateien anhand ihres Namens auszublenden. Es gibt jedoch keine Möglichkeit, Verzeichnisse zu ignorieren.
Ein anderer Ansatz ist, Ihre Shell das Matching durchführen zu lassen. Bash, ksh und zsh haben ein Negationsmuster,
!(t_*)
das mit allen Dateien außer den übereinstimmenden übereinstimmtt*
. in bash muss diese funktion mitshopt -s extglob
und in zsh mit aktiviert werdensetopt ksh_glob
. Zsh hat auch die äquivalente Syntax, mit^t_*
der aktiviert werden musssetopt extended_glob
. Dies ignoriert Verzeichnisse immer noch nicht. Zsh verfügt über eine zusätzliche Funktion, mit der Dateien nicht nur nach Namen, sondern auch nach Metadaten und mehr abgeglichen werden können: Glob-Qualifikatoren . Fügen Sie(.)
am Ende eines Spiels zu regulären Dateien zu beschränken. Die Negation^
ist Teil der Namensübereinstimmungssyntax und^t_*(.)
bedeutet daher "Alle regulären Dateien stimmen nicht übereint_*
" und nicht "Alle Dateien, die nicht mit regulären Dateien übereinstimment_*
".Wenn Sie ohne fortgeschrittene Werkzeuge auskommen, können Sie dies auf jedem Unix mit tun
find
. Es ist nicht die Art von Dingen, die Sie normalerweise in der Befehlszeile eingeben würden, aber es ist leistungsstark und präzise. Caleb hat bereits gezeigt, wie man das mit GNU find macht . Die-maxdepth
Option ist nicht portabel. Sie können-prune
stattdessen verwenden, um diefind
Rekursion portabel zu stoppen .Ersetzen Sie
-print
durch-exec ls -lG -- {} +
, umls
die gewünschten Optionen für die Dateien auszuführen .Alle obigen Befehle verbergen Punktdateien (dh Dateien, deren Name mit a beginnt
.
). Wenn Sie wollen , dass sie angezeigt werden , übergeben Sie-A
zuls
, oder fügen SieD
glob - Qualifikationsspiel in zsh (ls uploads/^t_*(.D)
). Mitfind
können Sie einen anderen Ansatz verwenden, um die Rekursion nur auf einer Ebene durchzuführen (Punktdateien werdenfind
nicht speziell behandelt). Dies funktioniert nur dann vollständig, wenn Siefind
im aktuellen Verzeichnis ausgeführt werden.quelle
-maxdepth
funktionieren, aber das "Portabilitäts" -Problem, auf das Gilles sich bezieht, ist, dass das BSDfind
(das ich auch unter OSX finde) ein etwas anderes Tier ist, also brauchst du vielleicht auch seine Antwort. @ Gilles: +1 für den zsh-Trick!prune
s kommen mir in den Sinn, aber ich lasse es los, indem ich sage, wenn ich auf meinen eigenen Systemen herumspiele, wie oft der Gedanke " würde dieser Befehl funktionieren, wenn ich eingeschaltet wäre AIX, Solaris oder MINIX3 "ist ungefähr ... Standby ... Es fällt mir schwer, einen Zählerstand zu erhalten ... das Display ist eingefroren0.00
.ls
keine--use-telepathy
Option? Auf diese Weise können Sie am schnellsten nur die gewünschten Dateien anzeigen. Es ist jedoch möglicherweise nicht portabel.quelle
$9
in dieser Aussage?ls
.print
$ NF` wäre besser, IMO. $ NF bedeutet die Anzahl der Felder, die 9 betragen würde, und wird in AWK häufig verwendet, um andere über $ NF zu unterrichten.quelle
find
?Lassen Sie es mich mit
ls
und Pipes ausprobieren:Sagen wir, die letzte Spalte ist die 9..
quelle
Wenn das Portabilitätsproblem von find -maxdepth ein Problem darstellt, können Sie Folgendes verwenden:
Ich bin kein Experte, aber ich denke, das sollte funktionieren. Ich nehme an, es sieht ein bisschen kryptisch aus, aber wenn Sie awk sprechen, ist es wirklich nicht. $ NF könnte anstelle von $ 9 verwendet werden. Sie könnten auch tun:
was dasselbe macht (aber vielleicht weniger effizient als das erstere ???).
Eigentlich sieht es nach dem Nachdenken über die anderen Beiträge so aus
ist ein noch kürzerer und klarerer Weg.
Bitte korrigiert mich jemand, wenn ich falsch liege. :-)
quelle
ls
ist im Allgemeinen keine gute Idee . Ihre awk-Tricks schlagen beispielsweise mit Dateinamen mit Leerzeichen fehl.Ich habe diese kurzen Wege gefunden:
oder
quelle
Probieren Sie diesen Alias aus und verwenden Sie ihn:
quelle
ls -hLlF
zeigt die Unterverzeichnisse und die Dateien, die mit beginnent_
. Wie beantwortet das die Frage?Kinderleicht:
ls -l --hide 't_*' <absolute path to desired directory> | grep -v ^d
quelle