Durchlaufen Sie einen Ordner und listen Sie Dateien auf

13

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?

Raji
quelle
1
benutze zuerst 'cd'. Wenn Sie es "locken" müssen, müssen Sie immer noch das Verzeichnis eingeben. Sie können auch verwenden echo ${dir##*/}, um den Pfad zu entfernen.
utopischer Ausdruck

Antworten:

31

Verwenden Sie basenamediese Option, 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 )
DopeGhoti
quelle
3

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

Eric Renouf
quelle
1
Das --wird hier nicht benötigt. Das erste Argument ist eine feste Zeichenfolge ohne Bindestriche.
Kusalananda
Wird ${parameter##pattern}auch von allen POSIX-Shells unterstützt.
Kusalananda
2

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!

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 data=@"$file" UPLOAD_ADDRESS
    done
fi
bb_referee
quelle
Was ist das Verzeichnis hier? $ '\ 0'? Ich möchte ein Verzeichnis übergeben, das sich in einer Variablen befindet ...
Soylent Graham
searchDir ist die Verzeichnisvariable. "-d $ '\ 0'" setzt das Trennzeichen des Lesebefehls auf null.
bb_referee
Wie erreiche ich dasselbe in einer sh-Shell? Ich benutze #! / Bin / sh
Ayusman
1

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 {} \;
ctx
quelle