Найдите каталоги без музыкальных файлов

Для тривиальных сообщений (никакие escape-последовательности, никакие опции), echo прекрасен. Как только Вам нужно что-то более сложное, Вы использование shoud printf который является портативным (т.е. ведите себя то же независимо от ОС), и позволяет намного лучшее форматирование, разрабатываемое с того же имени C функция.

Если Вы хотите звонить echo в Вашем примере корректный путь был бы также:

echo -n "blah" >/dev/udp/localhost/8125

или

echo "blah\c" >/dev/udp/localhost/8125

в зависимости от echo реализация Вы используете.

7
01.11.2013, 23:59
3 ответа

Я нашел этот пример на Так, названным: Терминал - Удаляет Все Папки Не файлы Conatining .mp3.

#! /bin/bash

find -depth -type d | while read -r D
 do
 v=$(find "$D" -iname '*.mp3')
 case "$v" in
 ""  )
    echo "$D no mp3"
    # rm -fr "$D" #uncomment to use
 ;;
 esac
done

Пример

Демонстрационные данные.

.
|-- 1
|   |-- 1.mp3
|   `-- 1.txt
|-- 2
|   `-- 2.mp3
|-- 3
|   `-- 3.txt
|-- 4
|   `-- 4.txt
|-- 5
|   `-- 5.mp3
|-- 6
|   `-- 61
|       `-- 61.mp3
|-- 7
|   `-- 71
|       `-- 71.txt
`-- deletenomp3.bash

Образец выполняется

Если бы я должен был выполнить его, то это удалило бы следующее:

$ ./deletenomp3.bash 
./7 no mp3
./7/71 no mp3
./4 no mp3
./3 no mp3

Другие типы файлов

Можно просто расширить это путем добавления больше -name аргументы 2-й находке управляют в сценарии. Пример, для добавления .wav файлы:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.wav');

Это говорит *.mp3 ИЛИ *.wav. Добавить больше или другие:

 v=$(find "$D" -iname '*.mp3' -o -iname '*.flac' -o -iname '*.m4a');

Я уверен, что этот блок мог быть сжат, если бы у Вас было намного больше типов файлов с помощью альтернативы, переключающейся на find.

4
27.01.2020, 20:17
  • 1
    OK, это работало! Большое спасибо за Вашу справку. Я хотел дать Ваши точки ответа, но так как я являюсь новым, система не позволит мне сделать это, так как я испытываю недостаток в :( –  volotec 02.11.2013, 00:48
  • 2
    @volotec - можно отметить его как принятый ответ 8-). После того как Вы преобладаете над 15 точками, можно запустить к upvote. –  slm♦ 02.11.2013, 00:49

Забавное решение включает a find внутри a find, но более безопасным способом, чем принятый ответ (мне лично не нравится анализировать вывод команды, будучи ls или find, особенно без мер предосторожности). Следующая команда распечатает папки, которые не содержат музыкального файла (здесь, средство музыкального файла имеет расширение mp3, flac, ogg, wav или m4a, но не стесняйтесь добавлять еще немного):

find . -depth -type d \! -exec sh -c 'find "$1" \( -iname "*.mp3" -o -iname "*.flac" -o -iname "*.ogg" -o -iname "*.wav" -o -iname "*.m4a" \) -type f | read a' _ {} \; -print

Необходимо попробовать это в системе, когда Вы счастливы способ, которым она ведет себя, замените финал -print с -exec rm -rfv -- {} \;

Путем имена файлов используются, здесь делает этот метод 100%-м сейфом относительно имен файлов с забавными символами (т.е. пробелы, цитирования, новые строки, запаздывающие новые строки, продвижение и конечные пробелы, и т.д.).

6
27.01.2020, 20:17
  • 1
    @volotec - поскольку я указал в своем ответе, он мог быть сжат, это то, как. –  slm♦ 02.11.2013, 01:35

Попробуйте что-то вроде (непротестированного):

for dir in ~/Music/* ; do
    found=false
    # Add your music file extensions here.
    for file in "$dir"/*.{mp3,wav} */ ; do
        if ls "$file" > /dev/null 2>&1 ; then
            found=true
            break
        fi
    done

    if ! $found ; then
        # Remove 'echo' when you are ready.
        echo rm -vrf "$dir"
    fi
done

Я не уверен, сколько оболочки поддерживают */ globbing. По крайней мере, Bash и Zsh делают.

0
27.01.2020, 20:17
  • 1
    Каталоги не пусты. Что он действительно хочет, каталоги, которые не содержат '*.mp3' или возможно '*.wav'. –  jordanm 01.11.2013, 23:34
  • 2
    Да я знаю. Вещью являются каталоги, которые я хочу удалить, содержат certains файлы, которые не являются музыкой. Например, файлы Thumbs.db. По этой причине я не могу использовать - пустая опция для –  volotec 01.11.2013, 23:34
  • 3
    находки, я считал вопрос слишком быстро и упустил основную суть. Я запишу новый ответ. –   01.11.2013, 23:35
  • 4
    я заменил свой ответ. –   01.11.2013, 23:40
  • 5
    На самом деле запущение Вашего скрипта заставило меня понять, что мой вопрос был неполным. Я собираюсь отредактировать его, Спасибо! –  volotec 01.11.2013, 23:56

Теги

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