Respostas:
Se você precisar renomear arquivos também em subdiretórios e o seu find
suporte ao -execdir
predicado, poderá fazer
find /search/path -depth -name '* *' \
-execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;
Obrigado a @glenn jackman por sugerir uma -depth
opção find
e me fazer pensar.
Observe que em alguns sistemas (incluindo os GNU / Linux), find
pode não conseguir encontrar arquivos cujo nome contenha espaços e também sequências de bytes que não formam caracteres válidos (normalmente, com arquivos de mídia com nomes com caracteres não ASCII codificados em um conjunto de caracteres diferente da localidade). Definir o código do idioma para C
(como em LC_ALL=C find...
) resolveria o problema.
-depth
opção find e você poderá se livrar do sort
.
-name '* *'
para -name '*_*'
e mude "${1// /_}"
para"${1//_/.}"
bash
página do manual.
Em qualquer shell, você pode fazer um loop sobre os arquivos cujo nome contém um espaço. Substituir os espaços por sublinhados é fácil no bash, ksh e zsh pela ${VARIABLE//PATTERN/REPLACEMENT}
construção.
for x in *" "*; do
mv -- "$x" "${x// /_}"
done
No Debian, Ubuntu e derivados, você pode usar o Perl rename
(outras distribuições oferecem um programa diferente rename
, e esse programa não é útil aqui).
rename 's/ /_/g' *
Uma solução zsh obrigatória:
autoload zmv
zmv '(*)' '${1// /_}'
Uma solução POSIX obrigatória:
for x in *" "*; do
y=$(printf %sa "$x" | tr " " "_")
mv -- "$x" "${y%a}"
done
s/…/…/g
significa substituir todas as ocorrências. Não está muito bem explicado no manual . Se você quiser renomear diretórios, existem várias maneiras, procure-o (acho que já vi isso antes) e se você não conseguir encontrá-lo, faça uma nova pergunta.
_MG_blah.JPG
para IMG_blah.JPG
.
Você pode usar rename
para isso (aqui assumindo o de util-linux
, não perl
aquele):
cd /path/to/dir
rename ' ' _ *\ *
Isso encontrará todo o espaço de arquivos e diretórios no nome e substituirá o espaço por um sublinhado. Como ele usa a correspondência de arquivos glob, você precisa estar no diretório certo para começar.
Se você deseja fazer correspondências recursivas, é possível, mas pode ser necessário executar rename
algumas vezes para capturar quaisquer itens nos diretórios que foram renomeados:
cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
rename
Renomeará os arquivos especificados substituindo a primeira ocorrência de from em seu nome por para ”. Portanto, isso funcionará apenas para arquivos com um único espaço em seu nome. (Você pode ligar rename
em loop, mas não é realmente a ferramenta certa aqui.)
Outra opção seria mmv
, se instalado.
mmv \*\ \* \#1_#2
_
, não funciona nomes com vários espaços.
No Debian / Ubuntu, com base nas respostas de Caleb e Gilles, foi o que funcionou para mim renomear arquivos recursivamente:
cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **
Nota: Para visualizar quais arquivos seriam renomeados e como, use a -n
opção com rename
:
rename -n 's/ /_/g' **
Outra nota: definindo globstar
marcas **
corresponder arquivos em todos os subdiretórios, de modo que apenas o diretório atual é desejada, não globstar conjunto ou usar *
, em vez de **
.
Mais uma observação: O rename
comando precisa ser executado mais de uma vez para arquivos com várias ocorrências do termo de pesquisa.
a b/c d
para a_b/c_d
não funcionaria, você precisaria primeiro renomear a b/c d
para a b/c_d
e depois a b
para a_b
).
rename
comando duas vezes?
**
exclui arquivos de ponto e percorre links simbólicos.
Se você não é um flash em expressões regulares (eu não sou!) E pode executar aplicativos projetados para o kde (você usa o kde - k desktop ou possui suas bibliotecas instaladas), o krename é um ótimo utilitário gráfico que permite ver o antes e o depois antes de se comprometer com as alterações. Ele tem várias transformações simples como opções e também suporta expressões regulares. Você pode até combinar várias transformações seqüenciais em uma única renomeação para não precisar projetar uma única transformação complexa que faça tudo de uma vez. Ele também tem uma opção para continuar renomeando os mesmos arquivos após a aplicação de uma renomeação.
Não o uso com tanta frequência, mas quando o faço, ele realmente realiza o trabalho com rapidez e facilidade. É realmente útil ao renomear vários arquivos de mídia baixados, para que você possa gerenciá-los uniformemente em seu sistema. Ajuda a baixar o manual do krename separadamente, para que você possa consultá-lo enquanto estiver usando o programa.
find -maxdepth 1
para fazer exatamente o que o OP pediu sobre como operar na pasta atual.