Estou procurando uma maneira (de preferência terminal) para organizar mais de 1000 fontes pela primeira letra.
Basicamente, crie diretórios A-Z, #
e mova os arquivos de fonte para esses diretórios com base no primeiro caractere do nome do arquivo. Fontes que começam com números [0-9] ou outros caracteres especiais a serem movidos para o #
diretório.
command-line
files
Parto
fonte
fonte
Respostas:
Uma opção de python atrasada:
Como usar
move_files.py
Execute-o com o diretório como argumento:
O script criará apenas o (sub) diretório (s) (maiúsculo) se for realmente necessário
Explicação
O script:
lista os arquivos, obtém o primeiro caractere (define o caminho de origem):
verifica se o item é um arquivo:
define a pasta de destino para se o primeiro caractere é alfa ou não:
verifica se a pasta já existe ou não, cria-a se não:
move o item para sua pasta correspondente:
fonte
Código-golfe ainda legível com apenas dois comandos e duas expressões regulares:
Se você tem uma quantidade enorme de arquivos para mover, muitos para caber na lista de argumentos do processo (sim, há um limite e pode ser apenas alguns kilobytes), você pode gerar a lista de arquivos com um comando diferente e canalizar para
prename
, por exemplo:Isso tem o benefício adicional de não tentar mover o nome do arquivo literal
[[:alnum:]]?*
se nenhum arquivo corresponder ao padrão global.find
também permite muito mais critérios de correspondência do que o shell globbing. Uma alternativa é definir anullglob
opção de shell e fechar o fluxo de entrada padrão deprename
. 1 1Nos dois casos, remova a
-n
opção para realmente mover os arquivos e não apenas mostrar como eles seriam movidos.Adendo: Você pode remover os diretórios vazios novamente com:
1 1
shopt -s nullglob; prename ... <&-
fonte
Se você não se importa com o zsh, uma função e alguns
zmv
comandos:A
mmv
função cria o diretório e move o arquivo.zmv
depois fornece correspondência e substituição de padrões. Primeiro, mova os nomes de arquivos começando com um alfabeto e depois todo o resto:Execute novamente sem o
echo
nammv
definição do que realmente executar o movimento.fonte
Não criei uma boa maneira de deixar os nomes dos diretórios em maiúsculas (ou mover os arquivos com letras maiúsculas), embora você possa fazê-lo posteriormente com
rename
...ou mais facilmente:
Remova
echo
após o teste para realmente mover os arquivosE depois
remova
-n
se parecer bom após o teste e execute novamente.fonte
if [[ -d "${i^}" ]]
para fazer oi
capital variável emkdir {A..Z}
no início.Os seguintes comandos no diretório que contém as fontes devem funcionar, se você desejar usar fora do diretório de armazenamento de fontes, mude
for f in ./*
parafor f in /directory/containing/fonts/*
. Este é um método muito baseado em shell, muito lento e também não é recursivo. Isso criará apenas diretórios, se houver arquivos que começam com o caractere correspondente.Como um liner, novamente a partir do diretório de armazenamento de fontes:
Um método usando find, com manipulação de string semelhante, usando expansão de parâmetros bash, que será recursiva e deve ser um pouco mais rápida que a versão pura do shell:
Ou mais facilmente:
fonte
Mapeie cada nome de arquivo para um nome de diretório usando
tr
, thenmkdir
emv
:fonte
tr
para converter em maiúsculas.xargs
apenas para ligarbash
novamente? Não seria mais simples e muito mais legível canalizar a saídafind
para um loop while eread
gravar registro por registro?while
versão do loop ( bit.ly/2j2mhyb ) talvez seja melhor.{}
substituição se você deixarxargs
de acrescentar o argumento e, em seguida, referem-se$1
dentro do script shell, por exemplo:xargs -0 -n1 -- bash -c 'dir=/dest/$(basename "$1" | ...); ...; mv "$1" "$dir"' _
. (Mente a final_
!)