Scorrere una cartella e elencare i file


14

Ho una cartella chiamata 'sample' e contiene 3 file. Voglio scrivere uno script di shell che leggerà questi file all'interno della cartella di esempio e lo pubblicherà su un sito HTTP usando curl.

Ho scritto quanto segue per elencare i file all'interno della cartella:

for dir in sample/*; do
        echo $dir;
        done

Ma mi dà il seguente output:

sample/log

sample/clk

sample/demo

Allega la cartella principale in essa contenuta. Voglio l'output come segue (senza il nome della cartella principale)

log

clk

demo

Come faccio a fare questo?


1
usa prima "cd". Se hai bisogno di 'arricciarlo', devi comunque inserire la directory. Inoltre è possibile utilizzare echo ${dir##*/}per decollare il percorso.
eexpress,

Risposte:


32

Utilizzare basenameper eliminare il percorso principale dai file:

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

Anche se perché no:

( cd sample; ls )

3

Supponendo che la shell lo supporti, è possibile utilizzare l'espansione dei parametri

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

o potresti semplicemente passare a quella directory e fare l'elenco lì


1
Non --è necessario qui. Il primo argomento è una stringa fissa senza trattini.
Kusalananda

Inoltre, ${parameter##pattern}è supportato da tutte le shell POSIX.
Kusalananda

2

Poiché i sistemi * nix consentono a quasi tutti i caratteri di far parte di un nome file (inclusi spazi bianchi, righe, virgole, simboli di pipe, ecc.), Non si dovrebbe mai analizzare l'output del comando "ls" in uno script shell. Non è affidabile Vedi Perché non dovresti analizzare l'output di ls .

Usa "trova" per creare un elenco di file. Se si utilizza Bash, è possibile inserire l'output di "find" in un array. Esempio sotto, con l'avvertenza che ho usato un comando "curl" non funzionante!

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

Qual è la directory qui? $ '\ 0'? Voglio passare una directory che si trova in una variabile ...
Soylent Graham,

searchDir è la variabile di directory. "-d $ '\ 0'" imposta il delimitatore del comando read su null.
bb_referee,

Come posso ottenere la stessa cosa in una shell? Sto usando #! / Bin / sh
Ayusman

1

Dipende da cosa vuoi fare con le directory.

Per stampare semplicemente il nome, senza verificare se si tratta di una directory è possibile utilizzare ls:

ls -1 sample

Meglio sarebbe trovare, perché è possibile utilizzare i filtri:

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

Se vuoi eseguire comandi sui file, dovresti usare find e non un ciclo for:

find sample -type d -maxdepth 1 -exec basename {} \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.