-1

Я только хочу рекурсивно сканировать Documents и не оставлять эту "родительскую" папку. Мой сценарий рекурсивно сканирует всю мою файловую систему, и я не уверен, какой элемент этого сценария вызывает это. Вот что у меня есть:

#/bin/sh
for f in $(find /home/rmintz/Documents/ -type f -name "*jpg")
do
  echo $f
done

Что мне нужно изменить, чтобы этот скрипт bash сканировал только папку « Documents » и ничего больше?

У меня создается впечатление, что это сканирует всю мою файловую систему, так как вывод в терминале показывает каталоги за пределами области /home/rmintz/Documents .

Примером является /usr/lib .

1 ответ1

5

Вы используете анти-шаблон, в котором вы никогда не должны использовать цикл for для перебора выходных данных команды find . Это немного похоже на синтаксический анализ вывода ls, чего также никогда не следует делать.

Вместо этого используйте встроенную возможность find для запуска команд:

find /home/rmintz/Documents/ -type f -name "*jpg" -exec echo {} \;

Здесь {} заменяется именем каждого найденного файла или каталога.

Если вы хотите использовать цикл (например, для более сложных операций), вам придется разделять каждый путь к файлу символом NULL, как это делает опция -print0 , и использовать while и read для анализа этого вывода:

find /home/rmintz/Documents/ -type f -name "*jpg" -print0 | while IFS= read -r -d '' file; do
    echo "$file"
done

Если вы этого не сделаете, а продолжите анализ выходных данных команды find , аргументы для for будут фактически разделены на каждый символ пробела. Это означает, что файлы с пробелом в имени будут фактически отображаться как два отдельных файла для echo . Кроме того, если ваш список файлов слишком длинный, вы превысите максимальный размер аргумента для команды. Вот где труба помогает во втором примере.

В вашем конкретном примере я не знаю, почему он выведет путь, подобный /usr/lib , поскольку это может иметь место только в том случае, если у вас есть реальная косая черта в имени файла, например, если ваш файл называется /usr/lib foo.jpg .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .