perl重命名:在子目录中的文件名之前添加一些内容

语法错误

尽管perlrename工具已成为我日常工作的宝贵伴侣,但仍有一些怪癖使工作更加困难-尤其是当文件不在当前工作目录中时。

假设有很多发票,并且我们知道customer1的所有发票都已分配给一个帐户。因此,为了使以后的脚本处理更加容易,我们希望在assi_“ assigned”之前添加前缀

例如:

/home/user/bizz/invoices $ ls -1 t1/inv*

t1/inv_customer1_20130506.txt
t1/inv_customer1_20130823.txt
t1/inv_customer1_20130930.txt
t1/inv_customer2_20131207.txt
t1/inv_customer2_20131113.txt

现在看看会发生什么:

/home/user/bizz/invoices $ rename 's/^/assi_/' t1/inv_customer1*

Can't rename t1/inv_customer1_20130506.txt assi_t1/inv_customer1_20130506.txt: No such file or directory
(etc.)

嘿嘿 rename已经选择了整个路径作为前缀assi_,而不是仅选择文件。因此,难怪它无法在不存在的目录“ assi_t1”中找到inv_customer1_20130506.txt

那么,如何rename教导仅将正则表达式应用于文件名呢?

注意:
1.我并不总是要转到cd子目录。
2.find如果可能的话,我将尽量避免使用循环

吉勒斯“别再邪恶了”

rename之所以这样工作,是因为它可以在目录之间移动文件。像一样mv,它作用于整个路径,而不仅仅是最后一个组件。

如果您只想修改最后一个组件,则可以将regexp锚定在(\A|?<=/),并确保它不匹配任何一个/,仅匹配到last /

rename 's~(\A|?<=/)(?=[^/]*)\z~assi_~' t1/inv_customer1*

另一种方法是首先分割文件名。

rename 's~(.*/)~~s; my $d = $1; s/\A/assi_/; $_ = "$d$_"' t1/inv_customer1*

您也可以使用该File::Spec模块。这具有应付非Unix路径的优势。

rename 'use File::Spec::Functions; my ($v,$d,$f) = splitpath($_); $f =~ s/\A/assi_/; $_ = catpath($v,$d,$f)' t1/inv_customer1*

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对于目录,将具有子目录名称+旧文件名的子目录中的文件重命名为新目录

bash重命名文件/在文件名中添加整数,在多个子目录中具有各种扩展名

根据一些计算重命名文件名

PHP使用子目录作为新文件名重命名所有文件

如何在脚本python3中递归重命名子目录和文件名?

bash-重命名子目录中的fasta标头和文件名-追加前缀

脚本从多个目录中删除中间字符,然后重命名子目录中的文件以包括目录+文件名

将所有文件移动到以部分文件名命名的子目录中

重命名不同子目录中的所有文件

重命名子目录中的所有文件

重命名多个子目录中的同名文件

重命名子目录中的所有文件

Git,忽略除子目录中的一些文件以外的所有文件

将子目录中的pdf文件重命名为子目录的名称

CMD迭代并递归重命名所有文件名,并将当前子目录文件夹追加到当前文件名

如何更改子目录中的文件名

在子目录中查找部分文件名

根据python中csv文件中的一些内容重命名csv文件

bash - 遍历子目录、cat 文件并使用目录名重命名

遍历子目录,并将给定扩展名的所有文件重命名为相同的文件名

在目录及其所有子目录中搜索文件名而不识别子目录中的文件

如何根据原始文件的更改重命名复制目录中的文件和子目录?

如何根据目录和子目录中的txt文件复制和重命名文件

在IntelliJ Spring Boot项目的静态目录中添加子目录会重命名吗?

在一个目录中创建一些子目录

截断和重命名目录中的子目录

如何遍历子目录和子目录中的文件,然后在 bash 中打印文件名

搜索和重命名和MV所有目录和子目录中的文件

解压子目录中的所有文件,并在其原始目录后重命名