Попробуйте этот bash-скрипт:
EXT=flac
for file in *.${EXT}; do
if [ ! -e ${file%.flac}.ogg ]; then
ffmpeg -i ${file} -qscale:a 6 ${file%.flac}.ogg
fi
done
Поскольку у вас уже есть метод для определения того, какие каталоги содержат более одного файла, и результат сохраняется в файле (, который вы назвали files.txt
), вы можете использовать сценарий оболочки для выполнения этой задачи:
#!/bin/bash
IFS=":"
while read path count
do
if (( count > 1 ))
then
echo "Remove all files in $path (count = $count)"
rm "$path/"*
fi
done < files.txt
Что-то вроде этого?
find. -type f -mindepth 6 \
| sed -r 's:/[^/]+$::' \
| sort \
| uniq -c \
| awk '$1 > 1 {print $2}' \
| xargs -i% find % -type f -delete
find. -type f -mindepth 6
получить список файлов
sed -r 's:/[^/]+$::'
удалить имена файлов, оставив только каталог
sort
требуется для правильной работы следующей команды
uniq -c
подсчет последовательных уникальных строк
awk '$1 > 1 {print $2}'
отфильтровать, где был найден только 1 элемент, в том, что осталось, есть 2 или более файлов
xargs -i% find % -type f -delete
искать файлы в каждом результирующем каталоге и удалять их все
С некоторыми обратными сальто и временным файлом мы, вероятно, могли бы избежать выполнения xargs find
, вместо этого получая список вещей, которые нужно удалить из ввода.
Если вы хотите прочитать файл в rm
, тогда каждая строка должна быть в осмысленной форме, которая указывает rm
удалить все файлы в перечисленных каталогах, то есть
rm./path/to/delete/*
Итак....
sed -E "s|:\s[0-9]+$|/*|" files.txt
Сообщает sed
заменить каждое вхождение последовательности :
пробел \s
одну или несколько цифр [0-9]+
и конец строки $
в вашем файле на /*
.
Если вы передадите это как есть в rm
, то будет выдано сообщение об ошибке, потому что вы также просите его удалить каталоги, поэтому, если сообщения вас беспокоят, перенаправьте stderr
rm $(sed -E "s|:\s[0-9]+$|/*|" files.txt) 2>/dev/null
Это не удастся, если в именах каталогов есть пробелы, и в этом случае, продолжая передавать файл в rm
, вы можете изменить IFS
и затем сбросить его
OFS=$IFS; IFS=$'\n'; rm $(sed -E "s|:\s[0-9]+$|/*|" files.txt) 2>/dev/null; IFS=$OFS