重命名文件名中的初始字符串

重命名文件名中的初始字符串

我需要动态删除名称的第一部分并复制到其他位置。我的文件名就像

Voice_XYZZ_1_1801.pdf
Voice_XYZZ_1_1801.ndx
Electon_MNOPQ_1_1801.pdf
Electon_MNOPQ_1_1801.ndx

在运行时,可以生成语音或电子或两者。我需要从文件名中删除初始部分,它们应该看起来像

XYZZ_1_1801.pdf
XYZZ_1_1801.ndx
MNOPQ_1_1801.pdf
MNOPQ_1_1801.ndx

我可以使用哪个命令来实现此目的?

答案1

f假设您使用的是 Bourne 系列的 shell,您可以使用以下命令从文件名变量中删除最短的前导子字符串匹配(包括下划线)${f#*_}

前任。

$ touch Voice_XYZZ_1_1801.pdf Voice_XYZZ_1_1801.ndx Electon_MNOPQ_1_1801.pdf Electon_MNOPQ_1_1801.ndx

$ for f in Voice_* Electon_*; do echo "${f#*_}"; done
XYZZ_1_1801.ndx
XYZZ_1_1801.pdf
MNOPQ_1_1801.ndx
MNOPQ_1_1801.pdf

您可以将其与命令一起使用mv来重命名文件,例如

for f in Voice_* Electon_*; do mv "$f" "${f#*_}"; done

可以使用以下命令类似地复制到另一个位置,cp例如

for f in Voice_* Electon_*; do cp "$f" "newdir/${f#*_}"; done

答案2

通过调用 Perl 单行代码,可以从命令行轻松完成此操作:

ls *_* | perl -ne 'chomp($_); $orig = $_; $_ =~ s/[^_]*_//; rename $orig,$_;'

这是代码的解释:

  • 将名称中包含“_”的所有文件名发送到下一个命令

    LS_|

  • 对于传入的每个字符串,执行以下命令

    珍珠岩

  • 从文件名中删除换行符(运行“ls”命令剩余的内容)

    咀嚼($_);

  • 删除单词的第一部分,搜索直到找到“_”

    $_ =~ s/[^]*//;

  • 重命名文件

    重命名$orig,$_;

相关内容