/ / Bash Перелік файлів списку, використовуючи для for loop-bash, for-loop

Bash Shell файли списку, використовуючи для for loop-bash, for-loop

Я використовую наступний сценарій Bash Shell, щоб рекурсивно перелічити файли ".txt" під поточним каталогом:

#!/bin/bash
for file in $( find . -type f -name "*.txt" )
do
echo $file
# Do something else.
done

Проте деякі файли ".txt" під поточним каталогом мають пробіли у своїх іменах, наприклад. "my testing.txt". Список стає пошкодженим, наприклад, "my testing.txt" вказано як

my
testing.txt

Здається, для циклу "for" використовується "пробіл" (пробіл, n і т.д.) для відокремлення списку файлів, але в моєму випадку я хочу використовувати тільки "n" для відокремлення списку файлів.

Чи можу я змінити цей сценарій для досягнення цієї мети. Будь-яка ідея.

Заздалегідь спасибі.

Відповіді:

7 для відповіді № 1

Якщо ви використовуєте bash 4, просто використовуйте glob:

#!/bin/bash

shopt -s globstar

for file in **/*.txt
do
if [[ ! -f "$file" ]]
then
continue
fi
echo "$file"
# Do something else.
done

Обов'язково цитуйте "$file" або у вас буде така сама проблема в іншому місці. ** буде рекурсивно збігатися з файлами та каталогами, якщо ви ввімкнули globstar.


7 для відповіді № 2

Так, є find відокремити імена файлів за допомогою NUL і використовувати read розмежовувати NUL. Це буде успішно повторюватися над будь-яким ім'ям файлу, оскільки NUL не є дійсним символом для імені файлу.

#!/bin/bash
while IFS= read -r -d "" file; do
echo "$file"
# Do something else.
done < <(find . -type f -name "*.txt" -print0)

Альтернативно, якщо # do something else не надто складний, ви можете використовувати findс -exec варіант, і не потрібно турбуватися про належне розмежування