Вместо создания файла abc.xyz
создайте символическая ссылка на (реальный) файл abc.xyz.YYYYMMDD
:
linkname="abc.xyz"
today="$( date +"%Y%m%d" )"
filename="$linkname-$today"
if [[ ! -e "$filename" ]] || [[ ! -e "$linkname" ]]; then
touch "$filename"
ln -s -f "$filename" "$linkname"
fi
Это создаст
lrwxr-xr-x 1 kk kk 16 Feb 2 11:16 abc.xyz -> abc.xyz-20170202
-rw-r--r-- 1 kk kk 0 Feb 2 11:16 abc.xyz-20170202
, и ваша программа, записывающая в abc.xyz
, фактически будет записывать в abc.xyz-20170202
.
На следующий день, когда вы запустите это, вы получите
lrwxr-xr-x 1 kk kk 16 Feb 2 11:31 abc.xyz -> abc.xyz-20170203
-rw-r--r-- 1 kk kk 0 Feb 2 11:16 abc.xyz-20170202
-rw-r--r-- 1 kk kk 0 Feb 2 11:31 abc.xyz-20170203
Либо в текущем каталоге нет файлов с суффиксом .txt
, либо в конце строки скрипта есть невидимый символ, например возврат каретки.
Возврат каретки мог появиться там, если вы редактировали текстовый файл сценария на компьютере с Windows и сохранили его как текстовый файл DOS.
Чтобы удалить их из всех строк, используйте dos2unix
в файле скрипта.
В любом случае шаблон не расширяется, потому что ему ничего не соответствует. Таким образом, оболочка сохраняет нерасширенный шаблон.
Если вы хотите, чтобы скрипт полностью пропускал цикл при отсутствии совпадающих имен файлов, установите параметр оболочки nullglob
:
shopt -s nullglob
Это заставляет bash
расширять не соответствующие -шаблоны в пустую строку.