copia arquivos para um novo nome - o caminho mais curto

1

Em um diretório, tenho cerca de 150 arquivos com uma certa extensão, por exemplo:

abc.ext
def.ext
ghi.ext
...

Agora eu quero copiar todos esses arquivos também para um novo nome de arquivo (sem extensão):

abc
def
ghi

Qual é o caminho mais curto para fazer isso? É possível sem escrever um loop em um arquivo bash?

Edit: Obrigado por suas respostas (dirkt, John Newman).
Depois de ver as respostas eu vou ficar com o mais curto, embora tenha um loop.

    
por Wolfgang Adamec 19.12.2016 / 18:32

2 respostas

2

É possível sem escrever um script ("arquivo bash"), mas não sem usar um loop:

for f in *.ext ; do cp -- "$f" "$(basename "$f" .ext)" ; done

basename pode ser usado para remover o sufixo.

    
por 19.12.2016 / 18:43
1

É definitivamente possível sem um loop. Isso é bom ... vou deixar isso para você.

$ find . -type f -name "*.ext" -print0 | xargs -0 -I {} echo cp -T {} {}SUB | sed -e 's/\.extSUB//g'

acrescente um tubo para sair do modo de funcionamento a seco. Backticks não são bons, já que ele remove as novas linhas, a menos que você lide com o $ IFS. E há outros problemas de caractere com backticks, como mencionado. Também precisa do cp -T como o último argumento normalmente está esperando um diretório.

Não tenho "representante" suficiente para comentar o acima, mas você pode usar vários truques com o bash ${} para evitar o bifurcação de basename .

Substring: ${f:0:-4} ou correspondência mais longa: ${f%%.ext}

    
por 19.12.2016 / 18:55