Включить nullglob
, чтобы несовпадающие символы подстановки расширялись до нуля. Затем вы можете пропустить синтаксический анализ ls
всего и просто выполнить итерацию по соответствующим файлам.
shopt -s nullglob
for m in {01..12}; do
for d in {01..31}; do
for f in ./mydir/2018.${m}.${d}T*.jpg; do
# process file
done
done
done
Если вам нужны все имена файлов одновременно, сохраните их в массиве . Массивы лучше, чем обычные строки, потому что они могут обрабатывать имена файлов с пробелами и другими специальными символами.
shopt -s nullglob
for m in {01..12}; do
for d in {01..31}; do
files=(./mydir/2018.${m}.${d}T*.jpg)
# process files
echo "processing ${files[@]}..."
done
done
Какой самый чистый способ локализовать магазин, чтобы восстановить nullglob на его исходное (неизвестное) значение после этого блока?
Использовать подоболочку: заключить блок в скобки. Подоболочка создает дочерний процесс, который гарантирует, что изменения не попадут в родительский процесс.
(
shopt -s nullglob
...
)
Это вежливо делать это всякий раз, когда вы изменяете параметры оболочки, и это элегантная альтернатива pushd
+ popd
. Обратите внимание, что любые переменные будут локальными для подоболочки, поэтому будьте осторожны.