Мой вопрос прост:
Мне назвали видеофайлы следующим образом:
xxxx_yyy_720_3800.mp4
xxxx_yyy_720_8000.mp4
где yyy может варьироваться по длине (например, yyyyyy или больше y)
Поскольку я не используюсь в сценариях оболочки, я хотел бы удалить автоматически (в указанной папке)
xxx_yyy_720_3800.mp4
существует и если файл xxx_yyy_720_8000.mp4
существует, удалить xxx_yyy_720_3800.mp4
xxx_yyy_720_8000.mp4
и не файл xxx_yyy_720_3800.mp4
, ничего не сделайте.Любая справка значительно ценилась бы.
find
и gawk
Установка gawk
sudo apt-get install gawk
Войдите в свою папку или замените .
после find
управляйте со своим foldername, например: find ~/my_video_duplicates f -iname …
Протестируйте команду
Команда ниже показывает только удалить кандидатам
find . -type f -iname "*_8000.mp4" -print0 | \
while read -d $'\0' file; do \
gawk -F_ '{ \
a=gensub(/\_8000\./, "_3800.", "g" , $0); \
system("if [ -f \""a"\" ]; then echo \""a"\" will be deleted; fi")}' <<< "$file";\
done
Проверьте снова, если Вы находитесь в правильной папке или заменяете .
после find
управляйте со своим foldername, например: find ~/my_video_duplicates f -iname …
Если Вы уверенный, выполняет команду ниже
find . -type f -iname "*_8000.mp4" -print0 | \
while read -d $'\0' file; do \
gawk -F_ '{ \
a=gensub(/\_8000\./, "_3800.", "g" , $0); \
system("if [ -f \""a"\" ]; then rm \""a"\"; fi")}' <<< "$file";\
done
Пример
Стартовая ситуация
% ls -og
total 3
-rw-rw-r-- 1 0 Jul 14 19:37 xxxx_yyy_720_3800.mp4
-rw-rw-r-- 1 0 Jul 14 19:20 xxxx_yyy_720_8000.mp4
-rw-rw-r-- 1 0 Jul 14 19:21 aaaa_yyy_720_8000.mp4
Пробный прогон
% find . -type f -iname "*_8000.mp4" -print0 | \
while read -d $'\0' file; do \
gawk -F_ '{ \
a=gensub(/\_8000\./, "_3800.", "g" , $0); \
system("if [ -f \""a"\" ]; then echo \""a"\" will be deleted; fi")}' <<< "$file";\
done
./xxxx_yyy_720_3800.mp4 will be deleted
Удаление
% find . -type f -iname "*_8000.mp4" -print0 | \
while read -d $'\0' file; do \
gawk -F_ '{ \
a=gensub(/\_8000\./, "_3800.", "g" , $0); \
system("if [ -f \""a"\" ]; then rm \""a"\"; fi")}' <<< "$file";\
done
Заключительная ситуация
% ls -og
total 2
-rw-rw-r-- 1 0 Jul 14 19:20 xxxx_yyy_720_8000.mp4
-rw-rw-r-- 1 0 Jul 14 19:21 aaaa_yyy_720_8000.mp4
Bash
Shell[ -f "file" ]
проверки, существует ли имя файла и является обычным файлом (например, не ссылка каталога или символьная ссылка)
"${name/%x/y}"
заменяет суффикс x
из $name
с y
.
Поэтому удалить xxx_yyy_720_3800.mp4
только если xxx_yyy_720_8000.mp4
существует, где xxx
и yyy
идентичны в каждом случае, for
все *_*_720_3800.mp4
in
текущий каталог:
for name in *_*_720_3800.mp4
do if [ -f "${name/%3800.mp4/8000.mp4}" ]
then echo "$name"
fi
done
Изменитесь echo
кому: rm
если Вы уверены, что это в порядке.