从文件名中删除模式

11

如何在文件名列表中删除结构为"myfile"的单词?

mywork_myfile_XSOP.txt
mywork_myfile_ATTY.txt
mywork_myfile_ATPY.txt
期望输出:
mywork_XSOP.txt
mywork_ATTY.txt
mywork_ATPY.txt    
3个回答

11

最简单的方法是使用通用的 rename 命令,该命令在大多数Unix系统中都可用。

rename 's/^mywork_myfile_/mywork_/' *
当然,这需要您在文件目录中操作。它不会覆盖文件。如果您希望这样做,只需传递-f选项。另外,请注意,有多个版本的rename,其可能具有不同的选项。

5

基于“将目录中所有文件从$filename_h重命名为$filename_half?”的此答案,这是一种方法:

for file in mywork_myfile*txt
do
   mv "$file" "${file/_myfile/}"
done

请注意,它使用bash字符串操作如下所示:
$ file="mywork_myfile_XSOP.txt"
$ echo ${file/_myfile/}
mywork_XSOP.txt

这确实是最干净的方法。虽然它是特定于Bash的,而且在其他shell中甚至不会在其他Posix风格的shell中工作,但这可能在今天已经可以接受了。每个人都使用Bash。 - DigitalRoss
这个问题被标记为 bash,所以我不会担心 POSIX 兼容性。尽管如此,一般来说,不能假设 bash 是系统 shell(Ubuntu),或者系统 shell 是当前版本的 bash(Mac OS X)。 - chepner
好的观点,但实际上问题并没有标记为bash。 - DigitalRoss
当我进行注释时。 - chepner
我的错,我编辑了问题并根据问题的类型添加了 bash。现在将其删除。 - fedorqui

3
这在任何Posix shell中都可以工作...
#!/bin/sh

for i
  in mywork_myfile_XSOP.txt \
     mywork_myfile_ATTY.txt \
     mywork_myfile_ATPY.txt; do
       set -x
       mv "$i" "$(echo $i | sed -e s/myfile_//)"
       set +x
done

也是一个不错的选择。请注意,通常建议使用$()而不是````。 - fedorqui
mv 的两个参数也应该被加上引号。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接