Как управлять несколькими именами файлов с помощью find?

Вы можете использовать шаблон глобуса:

*[[:digit:]]*d
  • * соответствует нулю или более символов

  • [: digit:] соответствует любой цифре в вашем языковом стандарте

  • d соответствует буквальному d , в конце здесь

Если вы не хотят зависеть от вашего языкового стандарта , только для кодировки ASCII:

*[0-9]*d

Пример:

% ls               
alle34mails  alle34mailsd  alle5m6ilsd.d  allemails  allemails.d

% ls *[[:digit:]]*d
alle34mailsd  alle5m6ilsd.d
1
20.09.2017, 11:46
1 ответ

Используйте 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"`/" '{}' \;
3
27.01.2020, 23:24

Теги

Похожие вопросы