2

Мой жесткий диск в беспорядке, поэтому я решил сделать уборку. Как часть этого, я хочу объединить все папки, содержащие музыку, в одну. То, что я хочу сделать, это найти любые * .mp3 и * .aac на моем диске и получить имена папок. Затем я хочу удалить все повторяющиеся имена папок и на последнем шаге получить только корневые каталоги. Мне трудно объяснить это точно, так что вот пример дерева:

root1 
|--folder1
  |--sub1
    |--file1.mp3
    |--file2.aac
  |--sub2
  |--sub3
    |--file3.mp3
    |--file4.aac
|--folder2
  | ...contains photos and documents (no mp3/aac)...
root2
|--folder3
  |--file4.mp3
  |--file5.aac
|--folder4
  |--file6.mp3

Для этого примера мой желаемый вывод - root1/folder1 root2/folder3 root2/folder4 .

Поскольку у меня есть только ограниченные знания о bash и UNIX-инструментах, я понятия не имею, как это сделать. Есть ли способ добиться этого? Я в порядке, если функции вашего решения find , но было бы гораздо лучше, если вместо этого использовать locate .

2 ответа2

3

Перейдите в каждую из последних папок верхнего уровня и переместите любые файлы .mp3 или .aac под этой папкой в текущую папку, затем удалите пустые папки, попробуйте:

for f in root*/folder*; do
    cd $f
    find -name "*mp3" -exec sh -c "mv {}  \$(basename {})" \;
    find -name "*aac" -exec sh -c "mv {}  \$(basename {})" \;
    find -type d -exec rmdir {} \;
    cd -
done

Вы увидите ошибки при попытке не пустые папки rmdir, но пустые будут удалены.

Если вы просто хотите узнать, какие папки верхнего уровня содержат подпапки с файлами mp3 или aac:

find -name "*mp3" -o -name "*aac" | cut -d/ -f1-3 | sort -u

Найдите все файлы .mp3 или .aac, которые возвращают серию строк, например "./root2/folder3/file4.mp3". Затем используйте команду cut, чтобы удалить все, кроме первых трех частей пути "./root2/folder3". Наконец, используйте sort -u для удаления любых дубликатов.

2

Найдите все файлы, заканчивающиеся на mp3 или aac, удалите имя файла с помощью sed и напечатайте только один экземпляр каждой папки.

locate  --regex '.*(aac|mp3)$' | sed -e 's,/[^/]*$,,' | uniq

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .