Alguém pode recomendar uma solução segura para substituir recursivamente espaços por sublinhados nos nomes de arquivos e diretórios a partir de um determinado diretório raiz? Por exemplo:
$ tree
.
|-- a dir
| `-- file with spaces.txt
`-- b dir
|-- another file with spaces.txt
`-- yet another file with spaces.pdf
torna-se:
$ tree
.
|-- a_dir
| `-- file_with_spaces.txt
`-- b_dir
|-- another_file_with_spaces.txt
`-- yet_another_file_with_spaces.pdf
linux
bash
whitespace
filenames
armandino
fonte
fonte
foo bar
e outro arquivofoo_bar
no mesmo diretório?Respostas:
Use
rename
(akaprename
), que é um script Perl que já pode estar no seu sistema. Faça isso em duas etapas:Baseado na resposta de Jürgen e capaz de lidar com várias camadas de arquivos e diretórios em um único limite, usando a versão "Revisão 1.5 1998/12/18 16:16:31 rmb1" de
/usr/bin/rename
(um script Perl):fonte
rename
página de manual (Eu não sabia que a ferramenta) e eu acho que você pode otimizar o seu código, alterandos/ /_/g
ay/ /_/
;-)brew install rename
Eu uso:
Embora não seja recursivo, é bastante rápido e simples. Tenho certeza de que alguém aqui pode atualizá-lo para ser recursivo.
A
${f// /_}
peça utiliza o mecanismo de expansão de parâmetros do bash para substituir um padrão dentro de um parâmetro pela string fornecida. A sintaxe relevante é${parameter/pattern/string}
. Consulte: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html ou http://wiki.bash-hackers.org/syntax/pe .fonte
rename
, e sua muito difícil de instalar este com bebida ..)for d in *\ *; do mv "$d" "${d// /}"; done
não sob pontuação.shopt -s globstar
efor f in **/*\ *; do ...
. Aglobstar
opção é interna ao bash, enquanto orename
comando é uma ferramenta comum do Linux e não faz parte do bash.${f// /_}
é uma expansão de variável Bash para pesquisa e substituição . - Af
é a variável dofor
loop para cada arquivo que contém um espaço. - O primeiro//
significa "substituir tudo" (não pare na primeira ocorrência). - Então o `/ _` significa" substituir espaço por sublinhado "não consegui acertar no começo, porque não pensei em diretórios.
fonte
IFS=''
na frenteread
. Além disso, pelo que posso dizer por outros comentários, osort
passo pode ser descartado em favor da-depth
opçãofind
.\
(barra invertida). Pode ser corrigido adicionando uma-r
opção para ler.rename
comando sugerido por Dennis.macports
tem orename
? Eu nunca me preocupei em descobrir porque acho que a tarefa não justifica a utilidade. E se você não temmacports
, você deve considerar instalá-los;)você pode usar
detox
por Doug Harplefonte
Uma solução de localização / renomeação . renomear faz parte do util-linux.
É necessário descer primeiro a profundidade, porque um nome de arquivo de espaço em branco pode fazer parte de um diretório de espaço em branco:
fonte
bash 4.0
fonte
a' to a subdirectory of itself,
a / a ')/dev/null
.mv
cinquenta e cinco mil vezes apenas para renomear quatro arquivos pode ser um pouco sobrecarregado, mesmo se você não inundar o usuário com mensagens.for file in *' '*
ou algo assim fazer um trabalho melhor?você pode usar isso:
fonte
Versão recursiva das respostas de Naidim.
fonte
Aqui está uma solução find -exec (bastante detalhada) que grava avisos "o arquivo já existe" no stderr:
fonte
Este faz um pouco mais. Eu o uso para renomear meus torrents baixados (sem caracteres especiais (não ASCII), espaços, vários pontos, etc.).
fonte
Eu encontrei em torno deste script, pode ser interessante :)
fonte
Aqui está uma solução de script bash de tamanho razoável
fonte
ls
.Para aqueles que estão enfrentando problemas com o macOS, primeiro instale todas as ferramentas:
Quando for necessário renomear, crie um alias para o GNU find (gfind) como find. Em seguida, execute o código de @Michel Krelin:
fonte
Isso localiza apenas arquivos dentro do diretório atual e os renomeia . Eu tenho esse alias.
find ./ -name "* *" -type f -d 1 | perl -ple '$file = $_; $file =~ s/\s+/_/g; rename($_, $file);
fonte
Eu apenas faço um para meu próprio propósito. Você pode usá-lo como referência.
fonte
Para arquivos na pasta denominada / files
fonte
Minha solução para o problema é um script bash:
basta colocar o nome do diretório, no qual você deseja aplicar o script, como argumento depois de executar o script.
fonte
Assim como a resposta escolhida.
fonte