![重命名文件名中的初始字符串](https://linux22.com/image/132535/%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%E7%9A%84%E5%88%9D%E5%A7%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我需要动态删除名称的第一部分并复制到其他位置。我的文件名就像
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,$_;