在 bash shell 中列出两侧不带扩展名的文件,但保留原始文件

在 bash shell 中列出两侧不带扩展名的文件,但保留原始文件

我想从这些文件中删除扩展名和前缀:

awstats.www.test1.com.conf
awstats.www.test2.com.conf
awstats.www.test3.com.conf

我需要删除awstats..conf,但保留文件www.test1.com不变。我怎样才能做到这一点?

答案1

假设您与文件位于同一目录中:

for name in awstats.*.conf; do
    basename "${name#awstats.}" .conf
done

循环内的代码将首先使用标准参数替换删除前缀awstats.$name然后删除basename后缀.conf

您也可以分两步完成,无需调用basename

for name in awstats.*.conf; do
    newname=${name#awstats.}  # trim off prefix
    newname=${newname%.conf}  # trim off suffix
    printf '%s\n' "newname"
done

这两个循环不会重命名任何文件。

答案2

我假设renameperl-rename在某些系统上,仅rename在其他系统上)在这里最简单:

rename 's/^awstats\.//;s/\.conf$//' awstats.*.conf

正则表达式的解释:

  • s/^awstats\.//awstats.在行首(文件名)处不替换任何内容
  • s/\.conf$//.conf在行尾(文件名)替换为空

使用该-n选项进行试运行!

相关内容