Замена нескольких символов в нескольких именах файлов в папке Unix

Не думаю, что это очень хорошая идея.

  1. Если rsnapshot запускается от имени пользователя root, вы должны его настроить.
  2. Если rsnapshot запускается как <имя пользователя> , они могут его настроить. Они могут добиться этого, используя свою собственную запись crontab.

Я бы выбрал первый вариант.

Но чтобы конкретно ответить на ваш вопрос, помните, что файл конфигурации можно указать с помощью параметра -c <имя файла> . Таким образом, потенциально вы можете запустить его, указав файл конфигурации для конкретного пользователя, которым они владеют и администрируют, например.

/usr/bin/rsnapshot -c /home/<username>/.rsnapshot.conf daily
1
25.10.2017, 18:04
1 ответ

Есть много способов сделать это. Вот одна команда, которая должна работать для вашего примера:

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done

В этом примере использовались Perl -совместимые регулярные -выражения, которые, похоже, ваш grepне поддерживает. Вот альтернатива с использованием основных регулярных выражений:

for oldname in *; do
    newname="$(echo "${oldname}" | grep -o 'ID[A-Z]\?[0-9]\+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done

Далее следует более подробное объяснение.


Выражение for oldname in *использует подстановочный -шаблон/шаблон для перебора файлов в текущем каталоге и сохраняет каждое имя в переменной oldname. Чтобы проверить это, вы можете запустить следующее:

for oldname in *; do echo "${oldname}"; done

Затем мы используем grepдля извлечения части имени файла -, которую вы хотите сохранить. Флаг опции -Pуказывает grepиспользовать Perl -совместимые регулярные выражения (, которые на самом деле не нужны в этой ситуации ), а флаг -oуказывает grepизвлекать только совпадающую подстроку (вместо того, чтобы печатать всю строку ). Шаблон \w?соответствует одиночному символу опции (, символу «слово» ), а шаблон \d+соответствует одной или нескольким цифрам. Мы можем протестировать регулярное выражение следующим образом:

for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+'; done

Затем мы используем trдля преобразования символов верхнего регистра в нижний:

for oldname in *; do echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z; done

Следующим шагом является использование подстановки команд для присвоения этой строки переменной и последующего вывода результата:

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z)" && echo "${newname}"
done

Затем добавляем в файл ".txt" -расширение:

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" && echo "${newname}"
done

Мы можем запустить эту команду для проверки работоспособности -, чтобы убедиться, что мы получаем ожидаемые результаты. Как только мы будем удовлетворены, мы заменим команду echoна команду mv:

for oldname in *; do
    newname="$(echo "${oldname}" | grep -Po 'ID\w?\d+' | tr A-Z a-z).txt" \
    && mv -i "${oldname}" "${newname}";
done
1
27.01.2020, 23:44

Теги

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