Пошук лише папок


2

Мій harddrive в безладді, тому я вирішив зробити прибирання. В рамках цього я хочу об'єднати всі папки, що містять музику, в одну. Що я хочу зробити, це шукати будь-які * .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він використовується замість цього.


Чи є причина, що ви не можете просто шукати файли, що закінчуються .mp3 інструментом пошуку GUI, а потім сортувати за папкою, у якій знаходиться файл? Потім просто перемістіть файли туди, куди бажаєте.
Давид

Якщо ви використовуєте locate, то будь ласка, переконайтеся, що ваш locationb оновлений. В іншому випадку пропустять деякі додані вами файли після оновлення. (Наприклад, додайте MP3. Updatedb. (Відмічаючи розташування кожного mp3). Додайте більше MP3 (яких ще немає у базі даних locate!)
Hennes

@Jikag: Це знищило б структуру підпапок, я хочу її зберегти.
Макс Бейкірх

Відповіді:


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". Потім скористайтеся розрізом, щоб видалити все, крім перших трьох частин шляху "./root2/folder3". Нарешті, використовуйте sort -u, щоб відкинути будь-які дублікати.


Моє погано, я не прочитав вашої відповіді до кінця. Дякую!
Макс Бейкірх

2

Знайдіть усі файли, що закінчуються у форматі mp3 або aac, зніміть назву файлу з sed та надрукуйте лише одну кількість кожної папки.

locate  --regex '.*(aac|mp3)$' | sed -e 's,/[^/]*$,,' | uniq
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.