Сглаживание иерархии каталогов с сохранением имен каталогов в новом имени каталога


7

Я в основном хочу пойти из этого:

.
├── Alan Walker
│   ├── Different World
│   │   ├── 01 Intro.mp3
│   │   ├── 02 Lost Control.mp3
│   │   └── cover.jpg
│   └── Same World
│       ├── 01 Intro.mp3
│       └── 02 Found Control.mp3
├── Aurora
│   └── Infections Of A Different Kind Step 1
│       ├── 01 Queendom.lrc
│       ├── 02 Forgotten Love.lrc
│       └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses
    └── Use Your Illusion I
        ├── 01 Right Next Door To Hell.lrc
        ├── 01 Right Next Door To Hell.mp3
        ├── 02 Dust N' Bones.lrc
        └── 02 Dust N' Bones.mp3

к этому:

.
├── Alan Walker - Different World
│   ├── 01 Intro.mp3
│   ├── 02 Lost Control.mp3
│   └── cover.jpg
├── Alan Walker - Same World
│   ├── 01 Intro.mp3
│   └── 02 Found Control.mp3
├── Aurora - Infections Of A Different Kind Step 1
│   ├── 01 Queendom.lrc
│   ├── 02 Forgotten Love.lrc
│   └── 03 Gentle Earthquakes.mp3
└── Guns N' Roses - Use Your Illusion I
    ├── 01 Right Next Door To Hell.lrc
    ├── 01 Right Next Door To Hell.mp3
    ├── 02 Dust N' Bones.lrc
    └── 02 Dust N' Bones.mp3

Ни одно из существующих решений, которые я смог найти, не включало переименование самого каталога. Было бы здорово сделать это с помощью zmv, но я не могу понять, как это сделать.


2
Не полное решение, поэтому не ответ: easytagможет позволить вам сделать это, но только для аудиофайлов - я не думаю, что это переместит обложки и т. Д.
rvs

2
Может ли быть несколько альбомов для конкретного исполнителя в одном каталоге? Структура всегда три уровня глубоко?
Nohillside

1
@nohillside Да, для исполнителя может быть несколько альбомов. И да, структура всегда на три уровня глубиной.
aksh1618

Ответы:


9

Zsh

Непроверенные:

zmv -Q '(*)/(*)(/)' '$1 - $2'
rmdir -- *(/^F)

Во второй строке удаляются все пустые каталоги, даже те, у которых ранее не было файла. Можно обойти это с помощью специальной mvоболочки, которая записывает, из каких каталогов она перемещает вещи.

Обратите внимание, что это пересекает символические ссылки на каталоги в текущем каталоге.

Утилита переименования Linux

Непроверенные.

rename / ' - ' */*/
rmdir -- */ 2>/dev/null

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

Скрипт переименования Perl

Непроверенные.

prename 's~/~ - ~' */*/
rmdir -- */ 2>/dev/null

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

Вот более сложный подход, который удаляет только те каталоги, из которых он что-то переименовал. Опять не проверено.

prename 's~([^/]+)/~$1 - ~ and ++$d{$1}; END {map {rmdir} keys %d}' */*/

12

Может быть как то так?

#!/bin/sh

for topdir in */; do
    topdir_name=$( basename "$topdir" )

    for subdir in "$topdir"/*/; do
        subdir_name=$( basename "$subdir" )

        newdir="$topdir_name - $subdir_name"
        if mkdir "$newdir"; then
            mv "$subdir"/* "$newdir"
            rmdir "$subdir"
        fi
    done

    rmdir "$topdir"
done

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

Эти rmdirвызовы будут терпеть неудачу , если любой каталог содержит скрытые имена файлов или если какие - либо из новых каталогов не удалось создать.

Это абсолютно непроверенный код. Запустите его на резервной копии ваших файлов.


Я имею в виду, да, что-то вроде бы сработало, но я как бы ищу решение с одной или двумя линиями, которое легко запускается из терминала. Некоторые находят / sed / zmv magic :)
aksh1618

10
Поместите ot в скрипт, и он станет однострочным.
Ханс-Мартин Моснер

4

Стратегически, вместо того, чтобы перемещать файлы, вы решили оставить текущую структуру на месте и создать ссылки для новой структуры, которую вы хотите?

Тактически шаблон, который будет выполнять эту работу, выглядит следующим образом:

find . -mindepth 2 -maxdepth 2 -type d -print0 | xargs -0n1 bash -c \
  'b=$(basename "$(dirname "$1")"); a=$(basename "$1"); echo ln -s "$1" "$b-$a"' {}
  • findнаходит все каталоги ровно на два уровня в глубине от текущего рабочего каталога, который должен быть каталогом, содержащим группы: таким образом, два уровня глубоко - это названия альбомов под названиями групп. 1
  • xargs использует каждый путь, содержащий альбом, и вызывает встроенный скрипт bash.
  • bash -c '...'принимает путь к альбому в качестве первого аргумента, разбивая его на две части: band ( $b) и album ( $a). Наконец, скрипт собирает имена в желаемый формат и связывает новое имя каталога с исходным каталогом.

Обратите внимание, что в этом примере ссылки будут создаваться в том же каталоге, из которого вы начинаете, что также происходит там, где находятся имена групп.

Вы можете - и должны - настроить lnвышеприведенную стратегию в соответствии со своими намерениями. mvс правильными путями, если вы физически хотите переставить, или lnесли вы хотите создать удобный «вид» на медиа. Важными частями внутри скрипта bash являются:

  • $bназвание группы. Всегда цитируйте это "$b".
  • $aназвание альбома. Всегда цитируйте это "$a".
  • $1физический путь к каталогу альбома. Всегда цитируйте это "$1".

1 Я считаю m{ax,in}depth, что поддерживаются GNU и некоторыми BSD find, но не POSIX: в этом случае полагайтесь на */*подобную гимнастику оболочки.


1
Мне нравится этот ответ ... вы могли бы также сделать жесткие ссылки, а затем удалить старую структуру папок, когда вы будете удовлетворены
Томас Цваагстра

@ThomasZwaagstra Это ничем не отличается от перемещения файлов
Darkhogg

1
@ Darkhogg Точно! ОП искал 1-лайнер для перемещения файлов. Использование жестких ссылок с этим решением почти достигло бы этого, за исключением того, что у вас был бы промежуточный этап «предварительного просмотра» перед удалением исходных файлов
Томас Цваагстра
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.