Como substituir um caractere por outro em todos os nomes de arquivos dos diretórios atuais?

34

Como você renomeia todos os arquivos / subdiretórios na pasta atual?

Digamos que eu tenha muitos arquivos e subdiretórios com espaços e quero substituir todos os espaços por um sublinhado.

File 1
File 2
File 3
Dir 1
Dir 3

deve ser renomeado para

File_1
File_2
File_3
Dir_1
Dir_3
    
por NobbZ 20.08.2011 / 07:26

6 respostas

31

Se você precisar renomear arquivos em subdiretórios, e seu find suportar o predicado -execdir , você poderá fazer

find /search/path -depth -name '* *' \
    -execdir bash -c 'mv -- "$1" "${1// /_}"' bash {} \;

Obrigado a @glenn jackman por sugerir a opção -depth para find e me fazer pensar.

Note que em alguns sistemas (incluindo os GNU / Linux), find pode não encontrar arquivos cujo nome contenha espaços e também sequências de bytes que não formam caracteres válidos (típico de arquivos de mídia com nomes com Caracteres ASCII codificados em um conjunto de caracteres diferente do locale). Definir a localidade como C (como em LC_ALL=C find... ) resolveria o problema.

    
por 20.08.2011 / 07:49
31

Em qualquer shell, você pode percorrer os arquivos cujo nome contém um espaço. Substituir os espaços por sublinhados é fácil em bash, ksh e zsh com a construção ${VARIABLE//PATTERN/REPLACEMENT} .

for x in *" "*; do
  mv -- "$x" "${x// /_}"
done

No Debian, Ubuntu e derivados, você pode usar o Perl rename (outras distribuições enviam um programa diferente como 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
    
por 21.08.2011 / 02:54
12

Você pode usar rename para isso (aqui assumindo o de util-linux , não o perl one):

cd /path/to/dir
rename ' ' _ *\ *

Isso localizará todos os 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 correto para começar.

Se você quiser fazer correspondências recursivas, pode ser necessário executar o rename algumas vezes para capturar todos os itens dos diretórios que foram renomeados:

cd /path/to/dir
shopt -s globstar
rename ' ' _ **/*\ *
!!; !!
    
por 20.08.2011 / 08:26
2

Outra opção seria mmv , se instalada.

mmv \*\ \* \#1_#2
    
por 20.08.2011 / 12:08
1

No Debian / Ubuntu, baseando-me nas respostas de Caleb e Gilles, foi isso que funcionou para eu renomear os arquivos recursivamente:

cd /path/to/dir
shopt -s globstar
rename 's/ /_/g' **

Observação: para visualizar quais arquivos seriam renomeados e como, use a opção -n com rename :

rename -n 's/ /_/g' **

Outra observação: a configuração de globstar torna os arquivos de correspondência ** em todos os subdiretórios, portanto, se desejar apenas o diretório atual, não defina globstar nem use * em vez de ** .

Mais uma observação: o comando rename precisa ser executado mais de uma vez para arquivos com várias ocorrências do termo de pesquisa.

    
por 20.12.2013 / 12:59
0

Se você não é um flash em expressões regulares (eu não sou!), e você pode rodar aplicativos criados para o kde (ou você usa o kdek desktop ou você tem suas bibliotecas instaladas), então o krename é um ótimo utilitário gráfico que permite que você veja antes e depois de antes de se comprometer com as mudanças. 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 sequenciais em uma renomeação para que você não tenha que projetar uma única transformação complexa que faça tudo de uma só vez. Ele também tem a opção de continuar renomeando os mesmos arquivos depois que uma renomeação for aplicada.

Eu não uso isso com frequência, mas quando o faço, o trabalho é feito de maneira rápida e fácil. Ele realmente é útil ao renomear vários arquivos de mídia baixados para que você possa gerenciá-los uniformemente em seu sistema. Isso ajuda a baixar o manual krename separadamente para que você possa consultá-lo enquanto usa o programa.

link

    
por 28.08.2011 / 23:15