Renomeando arquivos de maiúsculas para minúsculas

2

Eu preciso elaborar um pouco mais. Estes comandos são na verdade para um usuário do BBS FTN. O arquivo de configuração para o qual esses comandos residem, permite apenas declarações específicas. Aqui estão alguns exemplos:

exec "/home/imp/imp/poll.sh" *.su? *.mo? *.tu? *.we? *th? *.fr? *.sa? *.pkt
flag toss!.now [0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z][0-9a-Z].???
exec "/home/imp/imp/poll.sh /home/imp/hpt/secure" /home/imp/hpt/secure/*.[STFWMstfWM][ouaherOUAHER][0-9A-ZA-a] *.[pP][kK][tT]

É por isso que quero usar essa sintaxe ([0-9a-z] (por exemplo)). O problema é que o mailer está procurando por nomes de arquivos em minúsculas, mas apenas nomes de arquivos em maiúsculas existem.

Estou tentando converter um arquivo de maiúsculas para minúsculas usando a sintaxe abaixo:

mv /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9] /home/imp/hpt/outbound/[0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z][0-9a-z].[stfwm][ouaher][0-9a-za-a]

Eu não acho que tenho a sintaxe correta.

Aqui está um exemplo de um nome de arquivo que eu quero renomear:

0000FE70.FR0

Toda e qualquer ajuda é muito apreciada. Obrigado.

    
por ignatius 23.07.2016 / 05:18

6 respostas

2

Esta resposta do Alex B no Stack Overflow ajudará você a renomear arquivos e subpastas em um diretório.

Consiste em usar os comandos find e rename Linux. Gostaria apenas de acrescentar que o comando fornecido no link acima irá modificar os nomes dos diretórios também. Caso você queira apenas alterar nomes de arquivos, é necessário alterar a opção -depth com a próxima: -type f .

Outra expressão regular dada ao comando rename pode ser a seguinte, que eu acho que é mais fácil de entender.

 find my_root_dir -type f -execdir rename 'y/A-Z/a-z/' {} \;

Lembre-se de que existe um espaço em branco necessário entre a expressão regular do comando rename e as chaves, e outra entre elas e o caractere de término do comando \;

Lembre-se também que ele renomeará todos os arquivos não apenas no diretório em que você executar o comando (o diretório my_root_dir ), mas também em todos os arquivos em cada subpasta contida neste. Você pode usar a opção -maxdepth 0 com o comando find para forçá-lo a aplicar somente os testes e ações aos próprios pontos iniciais.

    
por 23.07.2016 / 06:08
2

Sempre que você quiser alterar uma classe de caracteres para outra, use tr .

for f in *; do
    test -f "$f" && echo mv "$f" "$( tr '[:upper:]' '[:lower:]' <<<"$f" )"
done

O script renomeará todos os arquivos no diretório atual para todas as letras minúsculas. Ele irá ignorar diretórios. Remova o echo quando tiver certeza de que faz o que deseja. Você pode substituir [:upper:] e [:lower:] por A-Z e a-z , respectivamente, se você tiver apenas nomes de arquivos ASCII padrão (nota: A-Z , não [A-Z] ).

Alternativamente, usando a substituição de variável de upper-to-minúsculas integrada do Bash:

for f in *; do
    test -f "$f" && echo mv "$f" "${f,,}"
done
    
por 23.07.2016 / 08:58
1

Script simples rename-lower para o diretório atual, se o comando rename não estiver funcionando, você pode alterar em mv.

#/bin/bash
# script to replace all upper case to lower case
for i in *
do
        d=$(echo ${i} |tr [:upper:] [:lower:]);
        if [ ${d} != ${i} ]
        then
                echo "renaming:" ${i} ${d}
                rename ${i} ${d} ${i}
#               mv ${i} ${d}
        fi
done

Exemplo

$ ls
tmp.EwcM2s6kfU  tmp.kcUX6rtjiu  tmp.kzpqLvWcnQ  tmp.N1H8bLt1at

$ rename-lower
renaming: tmp.EwcM2s6kfU  tmp.ewcm2s6kfu
renaming: tmp.kcUX6rtjiu  tmp.kcux6rtjiu
renaming: tmp.kzpqLvWcnQ  tmp.kzpqlvwcnq
renaming: tmp.N1H8bLt1at  tmp.n1h8blt1at
    
por 23.07.2016 / 08:46
1

com zsh :

autoload zmv # best in ~/.zshrc
zmv '[[:alnum:]](#c8).[STFWMfWM][OUAHER][0-9]' '${(L)f}'

Isso levará a verificação de possíveis conflitos.

    
por 23.07.2016 / 13:21
1

Aqui você está:

for i in $( ls | grep [A-Z] ); do mv -f $i 'echo $i | tr 'A-Z' 'a-z''; done

E este é um exemplo que mostra como funciona:

X$ ls

123123HHHSK FILE_[1-10] DB
FILE1       FILE_{1-10} SQL

X$ for i in $( ls | grep [A-Z] ); do mv -f $i 'echo $i | tr 'A-Z' 'a-z''; done

X$ ls

123123hhhsk file_[1-10] db
file1       file_{1-10} sql 

EDITAR : poderíamos usar facilmente a opção -f para evitar o uso de yes y .

    
por 23.07.2016 / 09:23
0

Seu comando mv não funciona como esperado porque o que acontece é que o shell expande os curingas e o resultado é uma lista única de nomes de arquivos que é passada para mv . A sintaxe de mv é mv SOURCE1 SOURCE2 … DESTINATION , ou seja, todos os argumentos, exceto o último, são nomes de arquivos a serem movidos para o destino. mv não suporta renomeação baseada em padrões.

Se você tiver o utilitário prename , poderá usá-lo para renomear arquivos executando o código Perl em cada nome. A sintaxe é prename PERL-CODE FILENAME1 FILENAME2 … . O nome do arquivo está na variável $_ , e a função lc converte seu argumento em lowerecase, então você pode usar o seguinte código:

prename '$_ = lc($_)' /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9]

Se você não tiver esse utilitário, faça o download de uma versão em CPAN .

Como alternativa, você pode renomear o shell com um loop. No bash, você pode usar ${x,,} para obter o valor de x convertido em minúsculas.

for x in /home/imp/hpt/outbound/[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z].[STFWMfWM][OUAHER][0-9]; do
  mv "$x" "${x,,}"
done
    
por 23.07.2016 / 16:17

Tags