Вы используете анти-шаблон, в котором вы никогда не должны использовать цикл 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
.