
Ich habe einen Ordner namens „Sample“ und er enthält drei Dateien. Ich möchte ein Shell-Skript schreiben, das diese Dateien im Sample-Ordner liest und sie mit Curl auf einer HTTP-Site postet.
Zum Auflisten der Dateien im Ordner habe ich Folgendes geschrieben:
for dir in sample/*; do
echo $dir;
done
Aber es gibt mir die folgende Ausgabe:
sample/log
sample/clk
sample/demo
Darin wird der übergeordnete Ordner angehängt. Ich möchte die folgende Ausgabe (ohne den Namen des übergeordneten Ordners)
log
clk
demo
Wie mache ich das?
Antwort1
Verwenden Sie dies basename
, um den führenden Pfad aus den Dateien zu entfernen:
for file in sample/*; do
echo "$(basename "$file")"
done
Aber warum nicht:
( cd sample; ls )
Antwort2
Vorausgesetzt, Ihre Shell unterstützt dies, können Sie die Parametererweiterung verwenden
for path in sample/*; do
printf -- '%s\n' "${path##*/}"
done
oder Sie wechseln einfach in dieses Verzeichnis und führen die Auflistung dort durch
Antwort3
Es hängt davon ab, was Sie mit den Verzeichnissen machen möchten.
Um einfach den Namen auszudrucken, ohne zu prüfen, ob es sich um ein Verzeichnis handelt, können Sie ls verwenden:
ls -1 sample
Besser wäre „find“, denn hier kannst du Filter verwenden:
find sample -type d -maxdepth 1 -printf '%f\n'
Wenn Sie Befehle auf den Dateien ausführen möchten, sollten Sie find und keine for-Schleife verwenden:
find sample -type d -maxdepth 1 -exec basename {} \;
Antwort4
Da *nix-Systeme nahezu jedes Zeichen als Teil eines Dateinamens zulassen (einschließlich Leerzeichen, Zeilenumbrüche, Kommas, Pipe-Symbole usw.), sollten Sie die Ausgabe des Befehls „ls“ niemals in einem Shell-Skript analysieren. Dies ist nicht zuverlässig. SieheWarum Sie die Ausgabe von ls nicht analysieren sollten.
Verwenden Sie „find“, 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 dem Vorbehalt, 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