Сортировка вывода команды find, повторное чтение для удаления файлов.

Попробуйте этот 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
0
11.11.2019, 17:38
3 ответа

Поскольку у вас уже есть метод для определения того, какие каталоги содержат более одного файла, и результат сохраняется в файле (, который вы назвали 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
-1
28.01.2020, 05:04

Что-то вроде этого?

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, вместо этого получая список вещей, которые нужно удалить из ввода.

0
28.01.2020, 05:04

Если вы хотите прочитать файл в 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
0
28.01.2020, 05:04

Теги

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