Sempre haverá um loop. Possivelmente você quer dizer que você quer uma ferramenta que esconda esse loop para você?
Em seguida, você pode usar perl
do rename
(às vezes chamado de prename
ou perl-rename
):
rename 's/\.[^.]+\.*\z//s' ./*.*
Ou zsh
' zmv
:
autoload zmv
zmv '(*).[^.]##.#' '$1'
Por padrão, eles não renomeariam os arquivos ocultos (aqueles cujo nome começa com .
). Se você quisesse processá-los também, você faria:
zmv '(?*).[^.]##.#(#qD)' '$1'
Eles consideram que em .foo.bar.
, a extensão é .bar.
(e não considere foo...
ter uma extensão). Você pode se adaptar se quiser considerar que é .
( zmv '(?*).*(#qD)' '$1'
). Não espero que você queira considerá-lo como .foo.bar.
(que zmv '*(#qD)' '${f%%.*}'
removeria (mas falhará, pois um arquivo não pode ter um nome vazio)).
Observe também que, em file.tar.gz
, a extensão é considerada .gz
, não .tar.gz
.
Para fazer isso de forma recursiva:
zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'
Ou com rename
:
find . -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +