# NOTE: using only bash builtins
# Assuming $d contains directory path
shopt -s nullglob
# Assign matching files to array
files=( "$d"/* )
if [ ${#files[@]} -eq 0 ]; then
echo 'No files found.'
else
# Whatever
fi
Присвоение массиву имеет и другие преимущества, включая желаемую (правильную!) Обработку имен файлов / путей, содержащих пробелы, и простую итерацию без использования вложенной оболочки, как показано в следующем коде:
find "$d" -type f |
while read; do
# Process $REPLY
done
Вместо этого вы можете использовать:
for file in "${files[@]}"; do
# Process $file
done
с тем преимуществом, что цикл запускается основной оболочкой, а это означает, что побочные эффекты (например, присвоение переменных), сделанные в цикле, видны для оставшейся части сценария. Конечно, это также способ быстрее, если производительность является проблемой.
Наконец, массив также может быть вставлен в аргументы командной строки (без разделения аргументов, содержащих пробелы):
$ md5sum fileA "${files[@]}" fileZ
Вы всегда должны пытаться правильно обрабатывать файлы / пути, содержащие пробелы, потому что однажды они произойдут!