借助 sed 重命名具有 2 个扩展名的系列文件

Rename series of files with 2 extentions by help of sed

我试图在一个文件夹中重命名一些具有 2 个扩展名的文件,该文件夹也有多个文件夹。 例如:

"./3/test/us.bak.alt" 
 "./3/test/ca.bak.alt" 
 "./3/test/me.bak.alt" 
 "./3/test/mi.bak.alt"
 "./3/new.BAK.alt" 
 "./3/alt.bak.alt"

这些应重命名为 *.BAK(因此应删除末尾的 .alt),但前提是 .BAK 文件尚不存在。 我试过这段代码:

 find  -name "*.alt" | sed 's/\(.*\)\.alt/mv "&" .BAK"/'

输出应该是这样的:

     "./3/test/us.BAK" 
     "./3/test/ca.BAK" 
     "./3/test/me.BAK" 
     "./3/test/mi.BAK"
     "./3/new.BAK"
     "./3/alt.BAK"

我在这里缺少什么?

如果允许您在计算机上安装工具,请考虑使用 rename(也称为 prenameperl-rename,具体取决于发行版)。当您需要对文件进行定期名称更改时,它很有用。例如,如果您有目录持有说:img001.jpegimg002.jpegimg003.jpeg 并想将其更改为 .jpg 文件,那么执行

就足够了
rename 's/jpeg/jpg' *.jpeg

您遗漏了几件事:

  1. 您应该将查找搜索限制为文件。
  2. 您的 sed 脚本不会将 .bak.alt 替换为 .BAK,而是将 .alt 替换为 .BAK
  3. 您的 sed 脚本中缺少双引号。
  4. 您应该将 sed 搜索限制在文件名的末尾。
  5. 您的输入列表中有一个 new.BAK.alt 文件。
  6. 您的输入列表中有一个空字符串 ""
  7. 您想要的输出列表中有一个 ./3/test/us.bak.alt,这显然与您的规范相矛盾。

让我们忽略最后 3 个问题,它们可能是错别字。要修复其他 4 个,请尝试:

find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/'

如果第五期是真实的并且您还有 *.BAK.alt 个文件要重命名为 *.BAK:

find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
  sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/'

使用其中之一,当您对打印输出感到满意时,如果您使用 GNU sed,则可以通过非常小的更改来执行它们:

find . -type f -name "*.bak.alt" | sed 's/\(.*\)\.bak\.alt$/mv "&" ".BAK"/;e'

或:

find . -type f \( -name "*.bak.alt" -o -name "*.BAK.alt" \) |
  sed -E 's/(.*)\.(bak|BAK)\.alt$/mv "&" ".BAK"/;e'

e sed 命令执行模式 space 的内容)。