在linux中不使用循环删除多个文件的扩展名

在linux中不使用循环删除多个文件的扩展名

示例文件:

RBFATL001USCGA002.--K1234--
RCAVTL001USCGA043.--K2135--

输出:

RBFATL001USCGA002
RCAVTL001USCGA043

答案1

总会有一个循环。也许您的意思是您想要一个隐藏循环的工具?

然后,您可以使用perl's rename(有时称为prenameperl-rename):

rename 's/\.[^.]+\.*\z//s' ./*.*

或者zshzmv

autoload zmv
zmv '(*).[^.]##.#' '$1'

默认情况下,这些文件不会重命名隐藏文件(名称以 开头的文件.)。如果你也想处理这些,你会这样做:

zmv '(?*).[^.]##.#(#qD)' '$1'

那些认为在 中.foo.bar.,扩展名是.bar.(并且不考虑foo...有扩展名)。如果您想考虑改为.( zmv '(?*).*(#qD)' '$1'),您可以进行调整。我不认为你会想考虑它.foo.bar.(这zmv '*(#qD)' '${f%%.*}'会剥离(但会失败,因为文件不能有空名称))。

另请注意,在 中file.tar.gz,扩展名被认为是.gz,而不是.tar.gz

递归地执行此操作:

zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'

或者与rename

find . -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +

答案2

这是一种不使用循环的方法。

find . -type f -name "?*.*" -exec sh -c 'mv -v "$0" "${0%.*}"' '{}' \;

相关内容