Трехступенчатое решение. cd
в каталог, где находятся файлы, а затем:
Это переместит каждый файл в соответствующий подкаталог:
find . -maxdepth 1 -type f -iname "* -*.epub" \ -exec bash -c ' mkdir "$" 2>/dev/null; mv -n -- "$1" "$"/ ' bash {} \;
"$"
является частью"$1"
до первого-
(пробел + минус). Мы ожидаем, что подкаталог уже существует;mkdir
потом не получится, все нормально.Это обнаружит подкаталоги с двумя или менее файлами и переместит все их содержимое (обратно) в текущий рабочий каталог:
find . -mindepth 1 -maxdepth 1 -type d \ -exec sh -c ' [ $(find "$1" -maxdepth 1 -type f -printf "\n" | wc -l) -le 2 ] ' sh {} \; \ -exec sh -c ' find "$1" -mindepth 1 -maxdepth 1 -exec mv -n -t ./ -- \{\} + ' sh {} \;
Измените
-le 2
фрагмент, чтобы скорректировать число. Вы можете спросить, почему я говорюfind
печатать новые строки вместо имен файлов (поведение по умолчанию). Это потому, чтоwc
это текстовый инструмент, возможные новые строки в именах файлов нарушат мою логику. Явная печать ровно одной новой строки на файл решает эту проблему.Это удалит пустые каталоги:
find . -maxdepth 1 -type d -empty -delete
Это должно работать даже без,
-empty
потому что-delete
(какrmdir
) удалит каталог, только если он пуст. Однако в этом случае я хотел бы подавить ожидаемые сообщения об ошибках, говорящие мне, что данный каталог не пуст. Выполнение этого2>/dev/null
также не позволит мне увидеть неожиданные сообщения об ошибках. Отсюда-empty
все равно.
Запустите эти пошаговые инструкции или создайте скрипт. Рекомендуется сделать резервную копию структуры каталогов заранее (например, на cp -lr my_directory my_directory_backup
всякий случай). Некоторые параметры, которые я использовал, не являются POSIX, они могут не работать для вас. Также, если у вас уже есть какие-либо подкаталоги, мое решение может их испортить; приспособьте это к своим потребностям тогда.