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


14

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

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

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

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

sample/log

sample/clk

sample/demo

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

log

clk

demo

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


1
сначала используйте «cd». Если вам нужно «свернуть», вам все равно нужно войти в каталог. Также вы можете использовать, echo ${dir##*/}чтобы убрать путь.
Утопический Экспресс

Ответы:


32

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

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

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

( cd sample; ls )

3

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

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

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


1
Здесь --не нужно. Первый аргумент - это фиксированная строка без черточек.
Кусалананда

Также ${parameter##pattern}поддерживается всеми оболочками POSIX.
Кусалананда

2

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

Используйте «найти», чтобы создать список файлов. Если вы используете 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

Какой каталог здесь? $ '\ 0'? Я хочу передать каталог, который находится в переменной ...
Сойлент Грэм

searchDir - переменная каталога. «-d $ '\ 0'» устанавливает разделитель команды чтения на ноль.
bb_referee

Как мне добиться того же в оболочке sh? Я использую #! /
Bin

1

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

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

ls -1 sample

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

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

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

find sample -type d -maxdepth 1 -exec basename {} \;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.