示例文件:
RBFATL001USCGA002.--K1234--
RCAVTL001USCGA043.--K2135--
输出:
RBFATL001USCGA002
RCAVTL001USCGA043
答案1
总会有一个循环。也许您的意思是您想要一个隐藏循环的工具?
然后,您可以使用perl
's rename
(有时称为prename
或perl-rename
):
rename 's/\.[^.]+\.*\z//s' ./*.*
或者zsh
是zmv
:
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%.*}"' '{}' \;