Ich habe einen Ordner mit dem Namen 'sample' und er enthält 3 Dateien. Ich möchte ein Shell-Skript schreiben, das diese Dateien im Beispielordner liest und sie mit curl auf einer HTTP-Site veröffentlicht.
Ich habe Folgendes geschrieben, um Dateien im Ordner aufzulisten:
for dir in sample/*; do
echo $dir;
done
Aber es gibt mir die folgende Ausgabe:
sample/log
sample/clk
sample/demo
Es hängt den übergeordneten Ordner darin an. Ich möchte die Ausgabe wie folgt (ohne den Namen des übergeordneten Ordners)
log
clk
demo
Wie mache ich das?
shell-script
files
directory
for
Raji
quelle
quelle
echo ${dir##*/}
, um den Pfad zu entfernen.Antworten:
Verwenden Sie
basename
diese Option, um den führenden Pfad von den Dateien zu entfernen:Aber warum nicht:
quelle
Angenommen, Ihre Shell unterstützt dies, können Sie die Parametererweiterung verwenden
oder Sie können einfach in dieses Verzeichnis wechseln und dort die Liste erstellen
quelle
--
wird hier nicht benötigt. Das erste Argument ist eine feste Zeichenfolge ohne Bindestriche.${parameter##pattern}
auch von allen POSIX-Shells unterstützt.Da mit * nix-Systemen fast jedes Zeichen Teil eines Dateinamens sein kann (einschließlich Leerzeichen, Zeilenumbrüche, Kommas, Pipe-Symbole usw.), sollten Sie die Ausgabe des Befehls "ls" niemals in einem Shell-Skript analysieren. Es ist nicht zuverlässig. Siehe Warum Sie die Ausgabe von ls nicht analysieren sollten .
Verwenden Sie "Suchen", um eine Liste von Dateien zu erstellen. Wenn Sie Bash verwenden, können Sie die Ausgabe von "find" in ein Array einfügen. Beispiel unten, mit der Einschränkung, dass ich einen nicht funktionierenden "Curl" -Befehl verwendet habe!
quelle
Es hängt davon ab, was Sie mit den Verzeichnissen machen möchten.
Um den Namen einfach auszudrucken, ohne zu prüfen, ob es sich um ein Verzeichnis handelt, können Sie ls verwenden:
Besser wäre es zu finden, da man Filter verwenden kann:
Wenn Sie Befehle für die Dateien ausführen möchten, sollten Sie find und keine for-Schleife verwenden:
quelle