Как slm уже указали, что можно протестировать на $f
, чтобы быть регулярным файлом. При изучении я изменил бы сценарий, чтобы не быть одним лайнером, они имеют тенденцию быть более твердыми считать и поддержать:
for f in *
do
if [ -f "$f" ]
then
mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"
fi
done
(можно всегда свернуть это позже путем вставки ;
и удаляющий новые строки)
-f
тестирует аргумент, чтобы быть регулярным файлом (не устройство или каталог), существуют другие тесты также (-d
для каталога, например, таким образом, вы могли протестировать если [!-d "$f"]
также в этом случае).
Это ошибка, сгенерированная Bash 3 для типового набора -A -A
. Ассоциативные массивы были добавлены в Bash 4, а не в Bash 3.2 и более ранних версиях.
Похоже, что ваш скрипт выполняется с другой версией Bash, чем та, которую вы используете в качестве оболочки. Если вы находитесь на одной машине в обоих случаях, то у вас установлено несколько версий и, вероятно, вы можете выбрать одну из них с другим путем. Если вы находитесь на другой машине, на которой запущен скрипт, вы можете установить более новую версию, но в противном случае вам не повезло с прямой поддержкой Bash.
zsh
поддерживает ассоциативные массивы с гораздо более старых версий, так что если у вас есть такая возможность, вы, скорее всего, сможете портировать ваш скрипт без лишней работы. Если у вас нет такой возможности, вы можете подделать его с помощью обычных массивов и grep
, или используя ${!prefix@}
и набор обычных переменных, который доступен в более старых версиях Bash. ${!prefix@}
распространяется на имена всех переменных, имена которых начинаются с префикса
, который можно использовать в комбинации с несколькими переменными префикс_key1
, префикс_another
, чтобы получить большинство поведений ассоциативных массивов.