it-swarm.com.de

Durchlaufen Sie einen Ordner und listen Sie Dateien auf

Ich habe einen Ordner namens 'sample' und er enthält 3 Dateien. Ich möchte ein Shell-Skript schreiben, das diese Dateien im Beispielordner liest und 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?

14
Raji

Verwenden Sie basename, um den führenden Pfad von den Dateien zu entfernen:

for file in sample/*; do
    echo "$(basename "$file")"
done

Aber warum nicht:

( cd sample; ls )
32
DopeGhoti

Angenommen, Ihre Shell unterstützt dies, können Sie die Parametererweiterung verwenden

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

oder Sie können einfach in dieses Verzeichnis wechseln und dort die Liste erstellen

3
Eric Renouf

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" in einem Shell-Skript niemals 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!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F ‘[email protected]"$file"’ UPLOAD_ADDRESS
    done
fi
2
bb_referee

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:

ls -1 sample

Besser wäre es zu finden, da man Filter verwenden kann:

find sample -type d -maxdepth 1 -printf '%f\n'

Wenn Sie Befehle für die Dateien ausführen möchten, sollten Sie find und keine for-Schleife verwenden:

find sample -type d -maxdepth 1 -exec basename {} \;
1
ctx