Вы можете сделать:
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
и, таким образом, позволяет передавать больше.