Цикл for в Linux обрабатывает шаблон как имя файла, когда файлов не существует - PullRequest
1 голос
/ 31 октября 2019

Я запустил следующее в каталоге без файлов:

for file in *.20191017.*;do echo ${file}; done

то, что было возвращено, было так:

*.20191017.*

, что немного неловко, так как это был просто шаблон, а несамо имя файла.

Может кто-нибудь помочь с этим?

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Нашли причину этой аномалии (источник: https://www.cyberciti.biz/faq/bash-loop-over-file/)

Вы можете выполнить расширение файла в цикле, например, работать со всеми файлами PDF в текущем каталоге:

for f in *.pdf; do
    echo "Removing password for pdf file - $f"
done

Однако,Существует одна проблема с вышеуказанным синтаксисом: если в текущем каталоге нет файлов pdf, он расширится до * .pdf (т. е. f будет установлен на * .pdf »). Чтобы избежать этой проблемы, добавьте следующий оператор перед циклом for:

#!/bin/bash
# Usage: remove all utility bills pdf file password 
shopt -s nullglob # expands the glob to empty string when there are no matching files in the directory.
for f in *.pdf; do
    echo "Removing password for pdf file - $f"
    pdftk "$f" output "output.$f" user_pw "YOURPASSWORD-HERE"
done
2 голосов
/ 31 октября 2019

Цикл for просто перебирает слова между in и ; (возможно, расширен на bash). Здесь file это просто имя переменной. Если вы хотите перебирать все файлы, которые действительно присутствуют, вы можете, например, добавить if, чтобы проверить, действительно ли существует ${file}:

for file in *.20191017.*
do
   if [ -e "${file}" ]
   then
      echo ${file}
   fi
done

Или вы можете использовать, например,find

find . -name '*.20191017.*' -maxdepth 1

-maxdepth 1 - избегать рекурсии .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...