Я використовую наступний сценарій 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
варіант, і не потрібно турбуватися про належне розмежування