Переименовывать файлы с приращением номеров

У операторов case нет возможности выполнять оценку условий так же, как у if/then. Оператор case/switch может только сопоставлять шаблоны и выполнять определенные случаи, основанные на сопоставлении.

Потенциальные решения

Я бы начал с использования [ ... ] вот так.

[ -d /path/to/folder1 ] && echo cmd1
[ -d /path/to/folder2 ] && echo cmd2
[ -d /path/to/folder3 ] && echo cmd3
[ -d /path/to/folder4 ] && echo cmd4
[ -d /path/to/folder5 ] && echo cmd5

Если впоследствии вам понадобится выполнять более сложные команды, то, возможно, вы захотите перейти на формальные if/then.

if [ -d /path/to/folder1 ]; then
  cmd1;
fi
-3
23.03.2018, 10:13
3 ответа

Простой bashскрипт:

for file in {access,error}.log.{999..1}; do
    echo "$file" "/path/to/dest/${file//[0-9]}$((${file//[a-z.]}+1))";
done
  • ${file//[0-9]}, это удалит цифры и сохранит только алфавит, что приведет к части error.log.или access.log..
  • ${file//[a-z.]}, это удаляет только буквы и точки (Я пишу a-z.из-за шаблонов имен ваших файлов ), что приведет к числовой части; и
  • $((${file//[a-z.]}+1))будет увеличивать единицу до числовой части, как показано выше.

Это переименует файлы, как показано ниже, и переместит их в/path/to/dest/:

access.log.999 --> /path/to/dest/access.log.1000
access.log.998 --> /path/to/dest/access.log.999
...
error.log.999 --> /path/to/dest/error.log.1000
error.log.998 --> /path/to/dest/error.log.999
...

Обратите внимание, что вместо echoдля пробного прогона -замените mvдля переименования файлов.

2
28.01.2020, 05:19
#! /usr/bin/env bash

# exit on error
set -e

# increase the numbers of the old archives (mv -i avoids accidental overwrite)
for ((i=999; i >= 2; i--)); do
    for name in access error; do
        if [[ -e /var/log/archives/$name.log.$i ]]; then
            mv -i "/var/log/archives/$name.log.$i" "/var/log/archives/$name.log.$((i+1))"
        fi
    done
done

# move current files to archives
for name in access error; do
    mv -i "/root/test/$name.log.1" "/var/log/archives/$name.log.2"
done
0
28.01.2020, 05:19

Мы могли бы запустить что-то вроде

perl -E 'for (reverse 1..999){
            rename( "access.log.$_", "access.log.".($_+1))}'
1
28.01.2020, 05:19

Теги

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