У меня есть куча видео-файлов в одной папке с двойным суффиксом avi.avi.
find /home/alex/Filme/ -type f -name '*.avi.avi'
/home/alex/Filme/Super 8.avi.avi
/home/alex/Filme/Exit - A Night From Hell.avi.avi
/home/alex/Filme/Der Plan.avi.avi
/home/alex/Filme/Ich.bin.Nummer.4.2011.avi.avi
snipp
Я пытаюсь удалить двойную строку с помощью следующего «Скрипта»
#!/bin/bash
for i in `find $HOME/Filme -type f -name '*avi.avi' -print0`
do
sed -e 's/'*.avi.avi'/'*.avi'/g'
done
Или это лучший способ добиться этого с помощью переименования, например этого?
find $HOME/Filme -type f -name '*avi.avi' -print0 -exec sh -c rename -v 's/*.avi.avi/*.avi/g' {} \;
Я не уверен, что имя папки будет сохранено. Да, я нашел несколько вопросов и ответов по этому поводу, но у меня есть проблемы с их адаптацией к моему случаю.
Работает ли один из моих подходов?
Вы были почти там.
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c "rename -v 's/\.avi\.avi$/.avi/'" {} \;
(Аргумент rename
является подстановкой регулярного выражения; и опция /g
будет полезна только в том случае, если вы хотите заменить каждое вхождение в соответствующем имени файла; но по определению в самом конце может быть только одно совпадение.)
Возможно, полезнее будет использовать это пакетно и, возможно, просто использовать mv
для улучшения переносимости.
find $HOME/Filme -type f -name '*avi.avi' -exec \
sh -c 'for f; do mv -v "$f" "${f%.avi}"; done' _ {} +
Если нет необходимости перемещаться по подкаталогам,
for f in $HOME/Filme/*.avi.avi; do
mv -v "$f" "${f%.avi}"
done
С помощью простойкоманды rename(Perl реализации ):
rename 's/(.*\.avi)\.avi$/$1/' /home/alex/Filme/*.avi.avi
Или просто удалив последнюю секцию .avi
:
rename 's/\.avi$//' /home/alex/Filme/*.avi.avi
Я использую этот код для переименования таких файлов
rename -v "s/\.avi$//g" *