Ich versuche, den Inhalt eines Verzeichnisses mithilfe eines Shell-Skripts abzurufen.
Mein Skript lautet:
for entry in `ls $search_dir`; do
echo $entry
done
Wo $search_dir
ist ein relativer Pfad? Allerdings $search_dir
enthält viele Dateien mit Leerzeichen im Namen. In diesem Fall wird dieses Skript nicht wie erwartet ausgeführt.
Ich weiß, ich könnte verwenden for entry in *
, aber das würde nur für mein aktuelles Verzeichnis funktionieren.
Ich weiß, dass ich in dieses Verzeichnis for entry in *
wechseln, es dann wieder ändern kann, aber meine besondere Situation hindert mich daran.
Ich habe zwei relative Pfade $search_dir
und $work_dir
, und ich muss an beiden gleichzeitig arbeiten, sie lesen, Dateien darin erstellen / löschen usw.
Was mache ich jetzt?
PS: Ich benutze Bash.
bash
shell
directory-listing
jrharshath
quelle
quelle
for entry in "$search_dir/*"
nicht funktionieren? Warum müssen wir/*
außerhalb von Anführungszeichen setzen?find
schneller?for entry in "${search_dir}/*"
Die anderen Antworten hier sind großartig und beantworten Ihre Frage, aber dies ist das beste Google-Ergebnis für "Bash Get List of Files in Directory" (nach dem ich gesucht habe, um eine Liste von Dateien zu speichern), also dachte ich, ich würde eine posten Antwort auf dieses Problem:
Wenn Sie nur einen bestimmten Typ möchten (z. B. TXT-Dateien):
Beachten Sie, dass $ search_path optional ist. ls> filename.txt führt das aktuelle Verzeichnis aus.
quelle
ls
zum Parsen von Dateinamen verwenden sollten? Ich habe noch nie davon gehört.Dies ist eine Möglichkeit, wenn die Syntax für mich einfacher zu verstehen ist:
./
ist das aktuelle Arbeitsverzeichnis, kann aber durch einen Pfad ersetzt werden,*.txt
der irgendetwas zurückgibt. txtSie können überprüfen, was einfach aufgelistet wird, indem Sie den
ls
Befehl direkt in das Terminal eingeben .Grundsätzlich erstellen Sie eine Variable,
yourfilenames
die alles enthält, was der Befehl list als separates Element zurückgibt, und durchlaufen sie dann. Die Schleife erstellt eine temporäre Variableeachfile
, die ein einzelnes Element der Variablen enthält, die sie durchläuft, in diesem Fall einen Dateinamen. Dies ist nicht unbedingt besser als die anderen Antworten, aber ich finde es intuitiv, da ich bereits mit demls
Befehl und der for-Schleifensyntax vertraut bin .quelle
A
,B
undC
. Sie erstellen Dateien mit dem NamenB\nC
undD
wählen Sie dann , sie zu löschen. Eine Software , die dieses Recht nicht umgehen konnte bereits existierende Dateien B und C am Ende Löschen statt , auch wenn Sie nicht haben , Erlaubnis dazu.)quelle
quelle
xargs -0 -i echo "{}"
Befehl bekommen. Möchtest du mich ein bisschen erklären? Was macht der-i echo "{}"
Teil insbesondere? Außerdem habe ich von derman
Seite gelesen, die-i
jetzt veraltet ist und wir sollten-I
insted verwenden.-i
ersetzt{}
mit dem arg.{}
die Zeichenfolge ist, die durch denfind
Befehl durch die Übereinstimmungen ersetzt wird .xargs
? Standardmäßig wirdfind
gedruckt, was gefunden wird. Sie können alles aus löschen-print0
.Variationen
Anmerkungen:
.
: aktueller Ordner-maxdepth 1
, um rekursiv zu suchen-type f
: finde Dateien, keine Verzeichnisse (d
)-not -path '*/\.*'
: nicht zurückkehren.hidden_files
sed 's/^\.\///g'
: Entfernen Sie das vorangestellte./
aus der Ergebnislistequelle
Hier ist eine andere Möglichkeit, Dateien in einem Verzeichnis aufzulisten (mit einem anderen Tool, das nicht so effizient ist wie einige der anderen Antworten).
echo *
Gibt alle Dateien des aktuellen Verzeichnisses aus. Diefor
Schleife durchläuft jeden Dateinamen und wird in stdout gedruckt.Wenn Sie im Verzeichnis nach Verzeichnissen suchen, platzieren Sie diese in der
for
Schleife:test -d
prüft, ob die Datei ein Verzeichnis ist.quelle
Die akzeptierte Antwort gibt kein Dateipräfix mit einem zurück. Verwenden Sie dazu
quelle
In der Linux-Version, mit der ich arbeite (x86_64 GNU / Linux), funktionieren folgende Arbeiten:
quelle
$search_dir
Wenn Sie nicht zitieren , wird es unterbrochen, wenn der Verzeichnisname ein Leerzeichen enthält. (In diesem Fall können Sie davonkommen, ohne zu zitieren$entry
, aber es wäre besser, es zu zitieren.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. Die Schleife wird zweimal ausgeführt, einmal gedrucktx
und das zweite Maly/*
, was vermutlich nicht das erwartete Ergebnis ist.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Wenn sichx
im aktuellen Verzeichnis auch ein Verzeichnis befindet, wird es zusammenfassend gelöscht, nur weil Sie Ihre Variable nicht angegeben haben!Geben Sie einfach diesen einfachen Befehl ein:
quelle