Я ищу способ (желательно терминальный) организовать более 1000 шрифтов по их первой букве.
В основном создайте каталоги, A-Z, #
затем переместите файлы шрифтов в эти каталоги, основываясь на их первом символе в имени файла. Шрифты, которые начинаются с цифр [0-9] или других специальных символов для перемещения в #
каталог.
command-line
files
Parto
источник
источник
Ответы:
Поздний вариант с питоном:
Как пользоваться
move_files.py
Запустите его с каталогом в качестве аргумента:
Сценарий создаст (под) каталог (-ies) (заглавными буквами), если он действительно нужен
объяснение
Сценарий:
выводит список файлов, получает первый символ (определяет исходный путь):
проверяет, является ли элемент файлом:
определяет целевую папку, если первый символ альфа или нет:
проверяет, существует ли папка или нет, создает ее, если нет:
перемещает элемент в соответствующую папку:
источник
Кодовый гольф, читаемый всего двумя командами и двумя регулярными выражениями:
Если у вас есть огромное количество файлов для перемещения, слишком много, чтобы поместиться в список аргументов процесса (да, есть предел, и он может составлять всего несколько килобайт), вы можете сгенерировать список файлов с помощью другой команды и канала для
prename
Например:Это дает дополнительное преимущество: не пытайтесь переместить буквальное имя файла,
[[:alnum:]]?*
если файлы не соответствуют шаблону glob.find
также позволяет использовать гораздо больше критериев соответствия, чем сглаживание оболочки. Альтернативой является установка параметраnullglob
оболочки и закрытие стандартного потока вводаprename
.1В обоих случаях удалите
-n
переключатель, чтобы фактически переместить файлы, а не просто показать, как они будут перемещены.Приложение: Вы можете снова удалить пустые каталоги с помощью:
1
shopt -s nullglob; prename ... <&-
источник
Если вы не возражаете против zsh, функция и пара
zmv
команд:mmv
Функция делает каталог и перемещает файл.zmv
затем обеспечивает сопоставление с образцом и замену. Сначала перемещаем имена файлов, начиная с алфавита, затем все остальное:Запустите снова без определения
echo
inmmv
для фактического выполнения перемещения.источник
У меня не получилось найти хороший способ сделать имена каталогов заглавными (или переместить файлы заглавными буквами), хотя впоследствии вы могли бы сделать это с помощью
rename
...или более наглядно:
Удалить
echo
после тестирования, чтобы фактически переместить файлыА потом
удалите,
-n
если он выглядит хорошо после тестирования и запустите снова.источник
if [[ -d "${i^}" ]]
чтобы сделать переменнуюi
капитала, иmkdir {A..Z}
в начале.Следующие команды в каталоге, содержащем шрифты, должны работать, если вы хотите использовать извне каталога хранения шрифтов, измените
for f in ./*
наfor f in /directory/containing/fonts/*
. Это очень основанный на оболочке метод, поэтому довольно медленный и нерекурсивный. Это создаст каталоги, только если есть файлы, которые начинаются с соответствующего символа.Как один вкладыш, опять же из каталога хранилища шрифтов:
Метод с использованием find с аналогичной манипуляцией со строками, использующий раскрытие параметров bash, которое будет рекурсивным и должно быть несколько быстрее, чем версия чистой оболочки:
Или более наглядно:
источник
Сопоставьте каждое имя файла с именем каталога, используя
tr
, затемmkdir
иmv
:источник
tr
для преобразования в верхний регистр.xargs
чтобы просто позвонитьbash
снова? Разве не было бы проще и намного более читабельно направить выводfind
в цикл while иread
записать его по записи?while
версия цикла ( bit.ly/2j2mhyb ), возможно, лучше.{}
замену , если вы позволитеxargs
Append аргумент , а затем обратитесь к$1
внутри скрипта, например:xargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (_