Использование петли for
по выходу find
в лучшем случае является анти--шаблоном. См. BashFAQ/001 -Как я могу прочитать файл (поток данных, переменную )строку -по -строку (и/или поле -по полю -)? почему. Используйте цикл while
, как показано ниже, с командой read
. Приведенная ниже команда разделяет вывод find
нулевым байтом, а команда read
читает путем разделения на этот байт, так что все файлы со специальными символами в именах безопасно обрабатываются (, включая новые строки)
#!/usr/bin/env bash
site="hello"
wDir="/home/websites/${site}/httpdocs/"
find "${wDir}" -name "*.css" -type f -print0 | while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done
Или вообще не используйте конвейерные -линии и выполняйте -подстановку
while IFS= read -r -d '' file; do
printf '%s\n' "$file"
done< <(find "${wDir}" -name "*.css" -type f -print0)
Веб-сайт ShellCheck не сообщает о каких-либо проблемах ни с одним из двух приведенных выше фрагментов кода.
Чтобы найти местоположение исполняемого файла в Linux, используйте which
или whereis
. Однако для обновления программного обеспечения рекомендуется использовать диспетчеры пакетов. Debian использует apt.
# sudo apt-get update
# sudo apt-get install sqlite3
# which ls
/usr/bin/ls
# whereis ls
ls: /usr/bin/ls /bin/ls /home/james/ls.txt /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz