Eu tenho que renomear uma árvore de pastas completa recursivamente para que nenhuma letra maiúscula apareça em qualquer lugar (é o código-fonte C ++, mas isso não deve importar).
Pontos de bônus por ignorar arquivos / pastas de controle de versão do CVS e Subversion. A maneira preferida seria um script de shell, já que um shell deve estar disponível em qualquer caixa do Linux.
Houve alguns argumentos válidos sobre os detalhes da renomeação do arquivo.
Eu acho que arquivos com os mesmos nomes em minúsculas devem ser substituídos; é problema do usuário. Quando feito check-out em um sistema de arquivos que ignora maiúsculas e minúsculas, ele substitui o primeiro pelo último também.
Eu consideraria os caracteres AZ e os transformaria em az; tudo o resto está apenas pedindo problemas (pelo menos com o código-fonte).
O script seria necessário para executar uma compilação em um sistema Linux, portanto, acho que as alterações nos arquivos de controle de versão do CVS ou Subversion devem ser omitidas. Afinal, é apenas uma verificação final. Talvez uma "exportação" seja mais apropriada.
ABCdef
,abcDEF
eaBcDeF
? O script de renomeação deve abortar ou apenas avisar e continuar? 2. Como você define letras minúsculas para nomes que não sejam US-ASCII? Se tais nomes estiverem presentes, deve-se primeiro verificar e excluir o passe? 3. Se você estiver executando uma operação de renomeaçãoRespostas:
Uma versão concisa usando o
"rename"
comando:Isso evita problemas com os diretórios sendo renomeados antes dos arquivos e tentando mover os arquivos para diretórios não existentes (por exemplo,
"A/A"
para"a/a"
).Ou, uma versão mais detalhada sem usar
"rename"
.PS
Este último permite mais flexibilidade com o comando mover (por exemplo,
"svn mv"
).fonte
then
linha fechada por(mv "${SRC}" "${DST}.renametmp" && mv "${DST}.renametmp" "${DST}") || echo "${SRC} was not renamed"
.find my_root_dir -depth -exec rename -c {} \;
. Adicionar -f para mudar o nome se você estiver em um sistema de arquivos de maiúsculas e minúsculas (por exemplo, Mac)-T
omv
comando.Menor ainda gosto bastante:
Em sistemas de arquivos que não diferenciam maiúsculas de minúsculas, como o HFS + do OS X , você deseja adicionar o
-f
sinalizador:fonte
The renaming utility that comes by default with Ubuntu is a Perl program sometimes called prename
perl-rename
(e é fornecido por um pacote com o mesmo nome)fonte
find
.find .
parece consertar isso.for f in `find .`; do mv -v "$f" "`echo $f | tr '[A-Z]' '[a-z]'`"; done
Simplesmente tente o seguinte se não precisar se preocupar com eficiência.
fonte
-0
interruptor (que é 'zero', sem compactação)zip -0 -r foo.zip foo/
,.-0
compressão, foi quase instantâneo!Cara, vocês / moças gostam de complicar demais as coisas ...
fonte
rename 'y/a-z/A-Z/' /tmp/*.jpg
->Can't rename /tmp/*.jpg /TMP/*.JPG: No such file or directory
, ou seja, tente renomear o caminho inteiro em vez de apenas o arquivo.A maioria das respostas acima é perigosa porque não lida com nomes contendo caracteres estranhos. Sua aposta mais segura para esse tipo de coisa é usar
find
a-print0
opção '' , que encerrará os nomes de arquivos com ASCII NUL em vez de \ n.Aqui está um script, que apenas altera arquivos e não nomes de diretório, para não confundir
find
:Eu testei e funciona com nomes de arquivos que contêm espaços, todos os tipos de aspas, etc. Isso é importante porque se você executar, como root, um desses outros scripts em uma árvore que inclua o arquivo criado por
... bem, adivinhe ...
fonte
rename
vez demv
.Isso funciona se você já possui ou configurou o comando renomear (por exemplo, através da instalação do brew no Mac):
fonte
brew install rename
--lower-case
? Infelizmente, esse não é o caso do Arch Linux.rename
não é um bash embutido. É um utilitário externo e a sintaxe será diferente dependendo da versão que você instalou. Esta resposta não é suficiente como uma solução portátil "para todos os sistemas operacionais baseados em unix", conforme reivindicado.rename
comando incluído no último Fedora (28), através doutil-linux-2.31
pacote, não tem a--lower-case
opção.Isso funciona no CentOS / Red Hat Linux ou em outras distribuições sem o
rename
script Perl:Origem: renomeie todos os nomes de arquivo de caracteres maiúsculos para minúsculos
(Em algumas distribuições, o
rename
comando padrão vem do util-linux, e essa é uma ferramenta diferente e incompatível.)fonte
A abordagem mais simples que encontrei no Mac OS X foi usar o pacote de renomeação em http://plasmasturm.org/code/rename/ :
fonte
Aqui está minha solução abaixo do ideal, usando um script de shell Bash:
Todas as pastas são renomeadas corretamente e
mv
não fazem perguntas quando as permissões não coincidem, e as pastas CVS não são renomeadas (os arquivos de controle CVS nessa pasta ainda são renomeados, infelizmente).Como "find-profundidade" e "find | sort -r" retornam a lista de pastas em uma ordem utilizável para renomear, eu preferi usar "-profundidade" para pesquisar pastas.
fonte
A pergunta original solicitava ignorar os diretórios SVN e CVS, o que pode ser feito adicionando -prune ao comando find. Por exemplo, para ignorar o CVS:
[edit] Eu tentei isso, e incorporar a tradução em letras minúsculas dentro da descoberta não funcionou por razões que eu realmente não entendo. Portanto, altere isso para:
Ian
fonte
Usando o fixador de nome de arquivo de Larry Wall:
É tão simples quanto
(onde
fix
é claro o script acima)fonte
Este é um pequeno script de shell que faz o que você solicitou:
Observe a ação -thpth na primeira localização.
fonte
Não é portátil, apenas Zsh, mas bastante conciso.
Primeiro, verifique se
zmv
está carregado.Além disso, verifique se
extendedglob
está ativado:Então use:
Arquivos e diretórios em letras minúsculas recursivamente em que o nome não é CVS .
fonte
find -depth
imprime cada arquivo e diretório, com o conteúdo de um diretório impresso antes do próprio diretório.${f,,}
minúsculas o nome do arquivo.fonte
-depth
correções! Esta é uma solução muito rápido, mas é claro sem utilizar a-print0
opção de encontrar, não é o mais confiávelCom o MacOS,
Instale o
rename
pacote,Usar,
Este comando encontra todos os arquivos com uma
*.py
extensão e converte os nomes de arquivos em minúsculas.Por exemplo,
fonte
-I
opçãoxargs
aqui?- I
bandeira não é obrigatória. É usado quando executamos vários comandos comxargs
. Aqui está um exemplo de como usar vários comandosxargs
cat foo.txt | xargs -I % sh -c 'echo %; mkdir %'
Você pode executar sem-I
gostofind . -iname "*.py" -type f | xargs -I% rename -c -f "%"
Use typeset :
No Windows, emulações, como Git Bash , podem falhar porque o Windows não diferencia maiúsculas de minúsculas. Para aqueles, adicione uma etapa que seja
mv
o arquivo com outro nome primeiro, como "$ old.tmp" e depois para$new
.fonte
Longo, mas "funciona sem surpresas e sem instalações"
Esse script lida com nomes de arquivos com espaços, aspas, outros caracteres incomuns e Unicode, funciona em sistemas de arquivos que não diferenciam maiúsculas de minúsculas e na maioria dos ambientes Unix-y que possuem bash e awk instalados (ou seja, quase todos). Ele também relata colisões, se houver (deixando o nome do arquivo em maiúsculas) e, é claro, renomeia os arquivos e diretórios e funciona recursivamente. Finalmente, é altamente adaptável: você pode ajustar o comando find para direcionar os arquivos / diretórios desejados e pode alterar o awk para fazer outras manipulações de nomes. Observe que, por "manipula Unicode", quero dizer que ele realmente converterá o caso deles (não os ignorará como respostas usadas
tr
).Referências
Meu script é baseado nessas excelentes respostas:
/unix/9496/looping-through-files-with-spaces-in-the-names
Como converter uma string para minúsculas no Bash?
fonte
Isso também funciona bem no macOS:
fonte
Eu precisava fazer isso em uma configuração do Cygwin no Windows 7 e descobri que havia erros de sintaxe com as sugestões acima que eu tentei (embora eu possa ter perdido uma opção de trabalho). No entanto, esta solução diretamente dos fóruns do Ubuntu funcionou fora da lata :-)
(NB: eu substituí anteriormente espaços em branco por sublinhados usando:
)
fonte
No OS X,
mv -f
mostra o erro "mesmo arquivo", então renomeio duas vezes:fonte
Eu procuraria o Python nessa situação, para evitar a otimização de caminhos sem espaços ou barras. Eu também descobri que
python2
tende a ser instalado em mais lugares do querename
.fonte
Se você usa o Arch Linux , pode instalar o
rename
pacote) a partir doAUR
qual fornece orenamexm
comando como/usr/bin/renamexm
executável e uma página de manual junto com ele.É uma ferramenta realmente poderosa para renomear rapidamente arquivos e diretórios.
Converter em minúsculas
Converter em maiúsculas e minúsculas
Outras opções
Você pode buscar o arquivo Developers.mp3 de exemplo aqui , se necessário;)
fonte
brew
do macOS está-l
vinculado à criação de um link simbólico e-c
à conversão para minúsculas, então cuidado.Primeiro, renomeie os diretórios de baixo para cima, classifique -r (onde -depth não está disponível), depois os arquivos. Então grep -v / CVS em vez de find ...- podar porque é mais simples. Para diretórios grandes, para f in ... pode estourar alguns buffers de shell. Use find ... | enquanto lê para evitar isso.
E sim, isso estraga arquivos que diferem apenas no caso de ...
fonte
find YOURDIR -type d | sort -r
é demais. Você querfind YOURDIR -depth -type d
. Segundo, ofind -type f
DEVE executar após os diretórios terem sido renomeados.Não tentei os scripts mais elaborados mencionados aqui, mas nenhuma das versões de linha de comando funcionou para mim no meu Synology NAS.
rename
não está disponível e muitas das variações defind
falha porque parece aderir ao nome antigo do caminho já renomeado (por exemplo, se encontrar./FOO
seguido por./FOO/BAR
, renomear./FOO
para./foo
continuará a ser listado,./FOO/BAR
mesmo que esse caminho não seja mais válido) . O comando acima funcionou para mim sem problemas.A seguir, é apresentada uma explicação de cada parte do comando:
Ele encontrará qualquer arquivo do diretório atual (mude
.
para o diretório que você deseja processar), usando uma pesquisa aprofundada (por exemplo, listará./foo/bar
antes./foo
), mas apenas para arquivos que contenham caracteres maiúsculos. O-name
filtro se aplica apenas ao nome do arquivo base, não ao caminho completo. Portanto, isso listará,./FOO/BAR
mas não./FOO/bar
. Tudo bem, pois não queremos renomear./FOO/bar
../FOO
Porém, queremos renomear , mas esse será listado mais tarde (é por isso que-depth
é importante).Esse comando por si só é particularmente útil para localizar os arquivos que você deseja renomear em primeiro lugar. Use isso após o comando rename completo para procurar arquivos que ainda não foram substituídos devido a erros ou colisões de nomes de arquivos.
Esta parte lê os arquivos gerados por
find
e os formata em ummv
comando usando uma expressão regular. A-n
opção parased
de imprimir a entrada e op
comando na regex de pesquisa e substituição gera o texto substituído.O regex em si consiste em duas capturas: a parte até o último / (que é o diretório do arquivo) e o próprio nome do arquivo. O diretório é deixado intacto, mas o nome do arquivo é transformado em minúsculas. Então, se
find
saídas./FOO/BAR
, ele se tornarámv -n -v -T ./FOO/BAR ./FOO/bar
. A-n
opção demv
garantir que os arquivos em minúsculas existentes não sejam substituídos. A-v
opção produz amv
saída a cada alteração que faz (ou não faz - se./FOO/bar
já existe, produz algo como./FOO/BAR -> ./FOO/BAR
, observando que nenhuma alteração foi feita). O-T
é muito importante aqui - trata o arquivo de destino como um diretório. Isso garantirá que./FOO/BAR
não seja movido para./FOO/bar
o diretório existente.Use isso junto com
find
para gerar uma lista de comandos que serão executados (útil para verificar o que será feito sem realmente fazê-lo)Isso é bastante auto-explicativo. Ele roteia todos os
mv
comandos gerados para o interpretador de shell. Você pode substituí-lo porbash
qualquer concha que desejar .fonte
Renomear Slugify (regex)
Não é exatamente o que o OP solicitou, mas o que eu esperava encontrar nesta página:
Uma versão "slugify" para renomear arquivos para que sejam semelhantes aos URLs (ou seja, incluem apenas alfanuméricos, pontos e traços):
fonte