É 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.
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.
É 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}