Вы можете использовать шаблон глобуса:
*[[:digit:]]*d
*
соответствует нулю или более символов
[: digit:]
соответствует любой цифре в вашем языковом стандарте
d
соответствует буквальному d
, в конце здесь
Если вы не хотят зависеть от вашего языкового стандарта
, только для кодировки ASCII:
*[0-9]*d
Пример:
% ls
alle34mails alle34mailsd alle5m6ilsd.d allemails allemails.d
% ls *[[:digit:]]*d
alle34mailsd alle5m6ilsd.d
Используйте rename
как часть команд Perl.
find. -type f -name '*20170919*' -execdir
rename -n 's/20170919/20170918/' '{}' \;
Используйте execdir
, поскольку он выполняет свою часть команды для запуска файла, найденного в их относительном пути, куда возвращается execdir
. Это пойло предотвратит передачу полного пути к файлу (относительно текущего рабочего каталога )и предотвратит неправильное переименование папки с тем же шаблоном вместо самого имени файла.
Если все ваши файлы находятся в одном каталоге, ниже одной строки rename
достаточно.
rename -n 's/20170919/20170918/' *20170919*
Удалите -n
, если вы уверены, что результат переименования действительно переименован. Возможно, вам придется добавить -v
, чтобы увидеть, что переименовывается.
В конце концов, вам может понадобиться сегодняшняя дата, если вы хотите, чтобы это выполнялось каждый день для группы файлов. затем используйте команду date
, как показано ниже в$(...)
(подстановка команды )между двойными кавычками.
find. -type f -name "*$(date +"%Y%m%d")*" -execdir
rename -n "s/$(date +"%Y%m%d")/$(date -d "-1day" +"%Y%m%d")/" '{}' \;
P.s. Поскольку вы используете оболочку csh
, вам нужно использовать `...`
вместо $(...)
или лучше переключиться на новые оболочки, такие как bash
, zsh
.
find./ -type f -name "*`date +"%Y%m%d"`*" -execdir
rename -n "s/`date +"%Y%m%d"`/`date -d "-1day" +"%Y%m%d"`/" '{}' \;