Переименование файлов, к которым добавляют метку даты, к предыдущему дню

Я хочу переименовать файлы в каталоге к порядковым номерам, на основе этого правила:
имя файла - [некоторая дата] => имя файла - [дата предыдущего дня]

Например, file20170329 file20170328 и file20170327 должны быть переименованы к file20170328 file20170327 и file20170326.

Я имею как 100 файлов, таким образом, мне нужен лучший прием, чем переименование каждого файла индивидуально.

3
задан 30 March 2017 в 10:44

3 ответа

Следующий сценарий:

  • для каждого файла
  • , Если имя файла больше, чем 8 (т.е. может содержать дату)
  • basefilename содержат имя файла без последних 8 символов
  • СЕГОДНЯ - содержит последние 8 символов (дата)
  • ВЧЕРА - содержит за один день до того, как $TODAY как 8 символов
  • Вместо того, чтобы использовать mv я создал /tmp/storage папка, и сценарий скопирует файлы в то местоположение. Таким образом, переименовывая один файл не повредит другой файл, если случайно basefilename для обоих файлов будет тем же, но дата, отличаются за один день

Примечание: Чтобы позволить сценарию выполняться cp, нужно удалить echo из echo cp ... строка

mkdir -p /tmp/storage
for f in *
do
  if [ "${#f}" -gt 8 ]; then
    filebasename=${f::-8}
    TODAY=${f: -8}
    YESTERDAY=`date '+%C%y%m%d' -d "$TODAY-1 days"`
    echo cp $f /tmp/storage/${f//$TODAY}$YESTERDAY; 
  fi
done

пример:

$ ls *20*
aaa2hhh20170329  aaahhh20170329  xajds20170222  xajsxs20170224

результат сценария:

cp aaa2hhh20170329 /tmp/storage/aaa2hhh20170328
cp aaahhh20170329 /tmp/storage/aaahhh20170328
cp xajds20170222 /tmp/storage/xajds20170221
cp xajsxs20170224 /tmp/storage/xajsxs20170223
3
ответ дан 1 December 2019 в 13:23

Если у Вас есть 100 файлов (и имейте доступ к жемчугу rename, обычно случай в Ubuntu), Вы могли использовать:

for n in {100..1}; do rename -n "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

Теперь, когда Вы используете -n для тестирования, оно жалуется как это:

rename(file20170217, file20170216)
file20170218 not renamed: file20170217 already exists
file20170219 not renamed: file20170218 already exists

, Но когда Вы выполняете его без -n, файл больше не существует, таким образом, переименование успешно:

for n in {100..1}; do rename "s/$(date --date="$n days ago" +"%Y%m%d")/$(date --date="$(($n+1)) days ago" +"%Y%m%d")/" *; done

, Если у Вас есть больше чем 100 файлов, необходимо увеличить диапазон до {150..1} или что бы то ни было.

Это очень медленно. Потребуется, возможно, 2 минуты или больше переименовать 100 файлов. Но это работает.

4
ответ дан 1 December 2019 в 13:23

или если Вы предпочитаете подход GUI, даете krename попытку, это имеет много модулей, и можно записать пользовательские сценарии в нем, "функция системы дат", "плагин времени даты" мог работать на Вас Krename GUI for plugins

http://www.krename.net/home/

sudo apt-get install krename
0
ответ дан 1 December 2019 в 13:23

Другие вопросы по тегам:

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