如何使用 sed 和 csv 重命名文件

Dᴀʀ*_*ᴅᴇʀ 4 shell bash sed rename csv

我是 Linux 新手sedawk但我不介意在新想法上挑战自己。话虽如此,我了解目的以及如何使用rename以及sed用于常见事件,例如从所有文件中添加$date或删除 a _1234。但是,我想弄清楚如何重命名 100 个除了文件类型之外彼此没有任何关系的文件。

重命名示例:

  • 旧名称 alpha.ai 更名为 omega.ai
  • 旧名称 pie32.ai 更名为 apple.ai
  • 旧名称 xmas.ai 更名为 santa.ai

我最初使用 bash 脚本将所有名称提取到 .csv 文件中,并将它们放在 A 列中。在 BI 列中写入新名称。现在既然没有发生共同的事件,你怎么能写sed或类似的东西来做到这一点??

#!/bin/bash
for i in *.ai
do
        mv $i $(echo $i | sed "a1,b1")

done
Run Code Online (Sandbox Code Playgroud)

pet*_*rph 7

如果你碰巧有一个看起来像这样的文件:

old_name1, new_name1
old_name2, new_name2
old_name3, new_name3
Run Code Online (Sandbox Code Playgroud)

你可以做一个肮脏的小把戏:

sed 's/^/mv -vi "/;s/, /" "/;s/$/";/' < names.csv | bash -
Run Code Online (Sandbox Code Playgroud)

sed comamnds(由分号分隔)执行此操作(s用于替代,/用作分隔符,任何其他字符都可以,@也经常使用):

  • s/^/mv -vi "/-mv -vi "在每一行的开头添加(^是行的开头);
  • s/, /" "/- 用" ";替换逗号后跟一个空格
  • s/$/";/- 将双引号附加到所有行($表示行尾)

因此输出sed将是这样的:

mv -vi "old_name1" "new_name1"
mv -vi "old_name2" "new_name2"
mv -vi "old_name3" "new_name3"
Run Code Online (Sandbox Code Playgroud)

这将被馈送bash到执行。文件名周围的引号不是强制性的,它们只是保护文件名中任何可能的空格(但是它们绝对不会帮助空格后跟逗号,因为它被用作分隔符)。显示它正在做什么的-v指令mv(如果出现问题,你会知道发生了什么),-i将导致它询问它是否覆盖已经存在的文件。