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

Я обнаружил, что это работает, если вы используете bootloader-id="Windows Boot Manager". Похоже, что это жестко закодировано в ноутбуке Acer Aspire.

13
18.08.2019, 23:33
4 ответа

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

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

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

( cd sample; ls )
34
27.01.2020, 19:52

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

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

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

3
27.01.2020, 19:52

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

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

ls -1 sample

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

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

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

find sample -type d -maxdepth 1 -exec basename {} \;
2
27.01.2020, 19:52

Поскольку *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
3
27.01.2020, 19:52

Теги

Похожие вопросы