Перебрать папку и вывести список файлов

Перебрать папку и вывести список файлов

У меня есть папка с именем 'sample', в которой находятся 3 файла. Я хочу написать скрипт оболочки, который будет читать эти файлы внутри папки sample и публиковать их на HTTP-сайте с помощью curl.

Я написал следующее для вывода списка файлов внутри папки:

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

Но он выдает мне следующий результат:

sample/log

sample/clk

sample/demo

Он прикрепляет родительскую папку в нем. Я хочу, чтобы вывод был следующим (без имени родительской папки)

log

clk

demo

Как мне это сделать?

решение1

Используйте basenameдля удаления начального пути из файлов:

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

Хотя почему бы и нет:

( cd sample; ls )

решение2

Если ваша оболочка поддерживает это, вы можете использовать расширение параметров

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

или вы можете просто перейти в этот каталог и сделать листинг там

решение3

Это зависит от того, что вы хотите делать с каталогами.

Чтобы просто вывести имя, не проверяя, является ли оно каталогом, можно использовать ls:

ls -1 sample

Лучше было бы найти, потому что можно использовать фильтры:

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

Если вы хотите выполнить команды для файлов, вам следует использовать find, а не цикл for:

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

решение4

Поскольку системы *nix допускают использование практически любого символа в имени файла (включая пробелы, переводы строк, запятые, символы конвейера и т. д.), вам никогда не следует анализировать вывод команды "ls" в скрипте оболочки. Это ненадежно. См.Почему не следует анализировать вывод ls.

Используйте "find" для создания списка файлов. Если вы используете Bash, вы можете вставить вывод "find" в массив. Пример ниже, с оговоркой, что я использовал нерабочую команду "curl"!

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

Связанный контент