Ответ 1
Поскольку вы не используете какие-либо более продвинутые функции find
, вы можете использовать простой шаблон для итерации по подкаталогам:
for i in ./*/; do
echo "$i"
done
У меня есть bash script, в котором мне нужно выполнить итерацию по каждой строке вывода команды find, но кажется, что я выполняю итерацию по каждому слову (пробелу) из команды find. Мой script выглядит так:
folders=`find -maxdepth 1 -type d`
for $i in $folders
do
echo $i
done
Я бы ожидал, что это даст результат, например:
./dir1 and foo
./dir2 and bar
./dir3 and baz
Но я получаю вывод следующим образом:
./dir1
and
foo
./dir2
and
bar
./dir3
and
baz
Что я здесь делаю неправильно?
Поскольку вы не используете какие-либо более продвинутые функции find
, вы можете использовать простой шаблон для итерации по подкаталогам:
for i in ./*/; do
echo "$i"
done
folders=`foo`
всегда ошибочно, потому что предполагается, что ваши каталоги не будут содержать пробелы, символы новой строки (да, они действительны!), символы glob и т.д. Один надежный подход (который требует расширения GNU -print0
):
while IFS='' read -r -d '' filename; do
: # something with "$filename"
done < <(find . -maxdepth 1 -type d -print0)
Другим безопасным и надежным подходом является то, что find
непосредственно вызывает вашу желаемую команду:
find . -maxdepth 1 -type d -exec printf '%s\n' '{}' +
См. страницу UsingFind для полной обработки темы.
Вы можете сделать что-то вроде этого:
find -maxdepth 1 -type d | while read -r i
do
echo "$i"
done