Процессы Python, появляющиеся и исчезающие вверху

Вы можете сделать:

find . -name '*\[M]\[@0]\[0].dav.avi' -type f -exec sh -c '
  for file do
    echo mv "$file" "${file%"[M][@0][0].dav.avi"}.avi"
  done' sh {} +

(удалите echo , если все в порядке).

Или, если вы хотите переименовать все .dav.avi в .avi , но также удалить [M] [@ 0] [0] if there:

find . -name '*.dav.avi' -type f -exec sh -c '
  for file do
    new=${file%.*.*}
    new=${new%"[M][@0][0]"}.avi
    echo mv "$file" "$new"
  done' sh +

Это синтаксис POSIX, они также работают с утилитами busybox, поэтому должны работать с Synology.

Несколько примечаний (на основе ваших собственных наблюдений и других ответов):

  • шаблон, переданный в find -name , должен быть заключен в кавычки, иначе он может быть расширен оболочкой.
  • вы не можете использовать xargs для имен файлов, если не можете гарантировать, что эти имена файлов не будут содержать пробелов, новых строк, кавычек или обратной косой черты.
  • Используйте printf вместо echo для вывода произвольных данных .
  • Оставление раскрытия переменной без кавычек в контексте списка имеет особое значение . Вы не хотите делать это здесь.
  • . символ - это специальный оператор регулярного выражения, вам нужно экранировать его в регулярных выражениях, если вы хотите, чтобы он трактовался буквально.
  • Синтаксис для чтения строки с read : IFS = read -r line , но опять же нет гарантии, что путь к файлу будет состоять только из одной строки.
  • Часто лучше выполнить (cd -P - "$ dir" && find. ... -exec) , чем find - "$ dir" ... -exec , потому что он позволяет избежать проблем со значениями $ dir , которые оказываются предикатами find или начинаются с - , а также потому, что это сокращает пути к файлам, передаваемые на -exec и, таким образом, позволяет передавать больше.

2
08.08.2015, 00:49
0 ответов

Теги

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