Список файлов оболочки Bash с помощью цикла for - PullRequest
6 голосов
/ 04 февраля 2012

Я использую следующий скрипт Bash Shell для рекурсивного вывода списка файлов .txt в текущем каталоге:

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

Однако некоторые файлы ".txt" в текущем каталоге имеют пробелы в именах, например, "мой testing.txt". Листинг поврежден, например, «my testing.txt» указан как

my
testing.txt

Кажется, что цикл for использует "пробел" (пробел, \ n и т. Д.) Для разделения списка файлов, но в моем случае я хочу использовать только "\ n" для разделения списка файлов.

Есть ли способ, которым я мог бы изменить этот скрипт для достижения этой цели. Любая идея.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 04 февраля 2012

Если вы используете bash 4, просто используйте глобус:

#!/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 голосов
/ 04 февраля 2012

Да, 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 's -exec вариант и не нужно беспокоиться о правильном разделении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...