GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash:ls * ohne Ordnergruppierung

Scheint ohne Ausgabeänderung nicht möglich zu sein, aber hier ist ein einfacher alternativer Weg:

find source/ -type f

Oder (spezifisch für GNU find), um nur Dateien in der Tiefe Ihrer Frage zu erhalten:

find source/ -type f -mindepth 2 -maxdepth 2

(oder wenn Sie Verzeichnisse wie ls möchten gibt, entferne -type f )


Du kannst einfach bei ls bleiben, wenn du ein paar Psychedlics hinzufügst (ls -d ):

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

Vielleicht interessiert Sie „der find des armen Mannes “:

shopt -s globstar

shopt -s s setzt die benannte(n) Shell-Option(en). Die globstar option ist in bash(1) wie folgt definiert:

Wenn gesetzt, das Muster ** Wird in einem Dateinamen/Pfadnamen-Erweiterungskontext verwendet, stimmt dies mit einer Datei [sic] überein undnull oder mehr Verzeichnisse und Unterverzeichnisse. Wenn dem Muster ein / folgt , nur Verzeichnisse und Unterverzeichnisse stimmen überein.

Also, nachdem Sie shopt -s globstar erledigt haben , einen der folgenden Befehle:

ls -d1 -- source/**                 # The character after the ‘d’ is the digit one.
ls -d -- source/** | cat            # i.e., it will write that into a pipe to any command.
printf "%s\n" source/**

erzeugt die Ausgabe:

source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png

Leider gehören dazu auch die Verzeichnisnamen. Es könnte Ihnen ein wenig helfen das zu wissen

printf "%s\n" source/**/

erzeugt die Ausgabe:

source/
source/fonts
source/images

d.h. nur die Verzeichnisnamen. Sie können die Ausgabe eines der ersten Befehle in eine Datei umleiten, die Ausgabe des obigen Befehls in eine zweite Datei umleiten und dann comm verwenden , diff , oder etwas Ähnliches, um die zweite Datei von der ersten zu subtrahieren, wobei nur die einfachen Dateien (keine Verzeichnisse) übrig bleiben. Aber tun Sie das nicht.

Ein anderer Ansatz (das ist nicht viel besser) ist

ls -d --file-type -- source/** | grep -v '/$'

Die --file-type Option sagt ls um einen / anzuzeigen am Ende jedes Verzeichnisnamens (und andere Zeichen am Ende anderer (spezieller) Dateitypen), wie folgt:

source//                            # Added an extra one
source/fonts/                       # Added one
source/fonts/fontello
source/images/                      # Added one
source/images/bg1.png
source/images/eng.png
source/images/fra.png

und dann die grep -v '/$' entfernt die Zeilen, die mit / enden;d.h. die Verzeichnisnamen. Leider ist die --file-type Option wird von POSIX nicht angegeben. Wenn Ihre Version von ls nicht unterstützt, verwenden Sie -F . Das ist wie --file-type außer es wird auch ein * angezeigt am Ende der Namen von ausführbaren Dateien, was manche Leute als störend empfinden. Sie können sie mit sed beseitigen :

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

Wenn Sie etwas mit allen Dateien (und nur den Dateien) machen wollen, können Sie das tun

for f in source/**
do
    if [ -f "$f" ]
    then
        Insert commands to be applied to plain files here.
    fi
done

Anmerkungen:

  • Wenn ls an ein Terminal ausgibt und nicht in -l ist (l ong)-Modus schreibt es mehrere Namen pro Zeile (es sei denn, die Namen sind sehr lang). Sie können es zwingen, einen Namen pro Zeile zu schreiben, indem Sie -1 angeben (eins) oder durch Umleiten der Ausgabe in eine Datei oder eine Pipe.
  • Wahrscheinlich brauchen Sie den -- nicht wirklich im ls Befehle, da Sie ein Verzeichnis auflisten, dessen Inhalt Sie erstellt haben. Sie sollten es verwenden, wenn Sie * auflisten in einem unbekannten Verzeichnis, als Schutz vor Dateinamen, die mit - beginnen .
  • Versuchen Sie nicht, die Ausgabe von ls zu parsen .
  • Der globstar Shell-Option scheint nicht von POSIX definiert zu sein. (Tatsächlich bin ich mir nicht sicher, ob POSIX jeden erkennt Shell-Optionen.) Es scheint zwar ein bash zu sein ism, Vorsicht – es ist möglicherweise nicht in allen Versionen von bash vorhanden.
  • Wenn fonts oder images hat Unterverzeichnisse, ** listet sie alle rekursiv bis ganz nach unten auf. Eine (etwas klobige und unzuverlässige) Möglichkeit, die Tiefe zu begrenzen, ist

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    wodurch Zeilen entfernt werden, die drei oder mehr / enthalten Zeichen.


Linux
  1. Bash-Skript zum Entfernen der ältesten Datei aus einem Ordner?

  2. Bash-Verlauf ohne Zeilennummern

  3. Führen Sie alle Shell-Skripte im Ordner aus

  4. Wiederherstellen von ~/.bashrc ohne Verwendung von Bash-Befehlen

  5. Timeout ohne Killing-Prozess in Bash

Bash-Exportvariable

Bash-Wartebefehl

Bash-while-Schleife

Bash Shebang

So zeigen Sie den Bash-Verlauf ohne Zeilennummern an

Wie überprüfe ich die Syntax eines Bash-Skripts, ohne es auszuführen?