Проведіть цикл через папку та список файлів


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##*/}для зльоту шляху.
eexpress

Відповіді:


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.
Kusalananda

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'" встановлює значення роздільника команди read.
bb_referee

Як я можу досягти того ж самого в оболонці sh? Я використовую #! / Bin / sh
Ayusman

1

Це залежить від того, що ви хочете робити з каталогами.

Щоб просто надрукувати ім'я без перевірки, чи це каталог, ви можете використовувати ls:

ls -1 sample

Краще буде знайти, тому що ви можете використовувати фільтри:

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

Якщо ви хочете запускати команди на файли, слід використовувати find, а не цикл:

find sample -type d -maxdepth 1 -exec basename {} \;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.