Explicação do comando para maiúsculas a primeira letra de um nome de arquivo

7

Estou tentando aprender a renomear arquivos com a linha de comando, e depois de percorrer muitas páginas eu finalmente encontrei um comando que maiúscula a primeira letra de um arquivo, mas o problema é que eu quero entender o significado de cada comando. O comando é:

for i in *; do new='echo "$i" | sed -e 's/^./\U&/''; mv "$i" "$new";done

Eu entendo o 'for' meio ... mas não o 'echo' ou '' 'e especialmente o comando sed. se alguém tiver um pouco de paciência para explicar o significado de cada coisa que seria incrível! Obrigado!

    
por user21294 10.06.2010 / 18:49

5 respostas

16

for i in *; 
    do new='echo "$i" | sed -e 's/^./\U&/'';
    mv "$i" "$new";
done;

Seria todo o código dividido para torná-lo facilmente visível, explicarei abaixo.

Primeiro temos que ter certeza de que processamos cada arquivo, a seguinte linha significa: "Faça o seguinte contanto que você possa encontrar arquivos"

for i in *;

Em seguida, temos que carregar o nome do arquivo atual (que é armazenado na variável $ i), substituir a primeira letra por uma versão em maiúscula e armazenar o novo nome (na variável $ new).

O seguinte comando basicamente significa: Tornar variável $ new ( do new= ) Carregue $ i e encaminhe-o ( "$i" | ) para uma função que substitui a primeira letra por uma maiúscula. ( sed -e 's/^./\U&/' ; ')

A página de manual do sed pode ser encontrada aqui . É usado para realizar transformações básicas de texto. O que basicamente é fazer é usar uma expressão regular (a 's/^./\U&/' part) (uma maneira de detectar um determinado padrão em um texto) para detectar os primeiros caracteres não capitalizados e substituí-los por uma versão em maiúsculas.

do new=echo "$i" | sed -e 's/^./\U&/';

Depois de obtermos o novo nome, é hora de renomear o arquivo com o novo nome em maiúscula, o seguinte comando faz isso.

Ele diz: mova (mesmo que renomeie) o arquivo antigo foo.bar para o novo Foo.bar.

mv "$i" "$new";

Portanto, agora temos um arquivo renomeado e é hora de passar para o próximo. O seguinte conclui a função for, dizendo que agora é hora de seguir adiante e processar o próximo arquivo.

done;
    
por 10.06.2010 / 19:02
5

Aqui estão algumas outras técnicas, caso seu sed não suporte \U :

for i in *; do first=$(echo "${i:0:1}" | tr '[:lower:]' '[:upper:]'); new=$first${i:1}; mv "$i" "$new"; done

Se você tem Bash 4:

for i in *; do mv "$i" "${i^}"; done
    
por 10.06.2010 / 22:10
4

Bem-vindo ao Bash, onde quase tudo é possível, se não imediatamente óbvio.

A explicação do BloodPhilia é muito boa para o seu pedido específico. Se você estiver interessado, veja alguns recursos adicionais da Web para saber mais:

Bash:

Sed (que é o ED'itor 'S'tream'):

por 10.06.2010 / 19:40
1

Para capitalizar cada primeiro caractere no nome do arquivo com o BASH, você pode usar a seguinte construção: file_words=( $file ) echo "${file_words[@]^}"

É muito mais claro do que usar sed e você só usa BASH, por isso é mais rápido.

    
por 10.08.2018 / 15:05
-1

E se você tiver zsh:

for i in *; do mv $i ${(C)i}; done
    
por 10.06.2010 / 23:08