如何使OneDrive消毒器工作?

时间:2019-03-31 22:45:22

标签: regex perl

我正在学习编码,然后按照以下教程尝试解决令人烦恼的问题-清理macOS上的文件,以免它们阻碍OneDrive正常工作。

我已经遵循了一些教程,并且几乎可以完成我希望的工作。

#!/usr/bin/perl -w
use strict;
use warnings;
use File::Find;

my @argv;
my $dir = $ARGV[0];

find(\&dirRecurs, $dir);

sub dirRecurs{

    if (-f and not 's/^\./' )
    {
        (my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;
        rename($_, $txt);
    }

}

由于.dotfiles,我希望它从重命名过程中排除and not 's/^\./',但事实并非如此。如果我从if行中删除了and not 's/^\./',则所有操作都可以实现,除了

我希望正则表达式中的\/重命名more/less.pdf之类的文件,但不会

1 个答案:

答案 0 :(得分:0)

有问题的代码行是:

if (-f and not 's/^\./' )
  • -f为true并且's/^\./'为false时,此操作成功
    • -f测试$_是否是文件
    • 在布尔上下文中,'s/^\./'测试给定的字符串是否不为空

很显然,其中包含某些字符的任何字符串都不为null,因此if测试始终会失败。

看看字符串的内容,很明显是要插入一个正则表达式测试。所需的形式是m//形式(“匹配”)。 (几乎)提供的是s///的格式错误的版本(搜索并替换)。

在Perl中,正则表达式通常不显示为字符串。适当的形式是(m是可选的):

if (-f and not m/^\./)

几个侧面:

  • @argv未在您的代码中使用(并且与@ARGV不同)
  • 使用find(\&dirRecurs, @ARGV);搜索多个路径(作为perl脚本的参数提供)
  • 即使没有更改,也可以执行重命名。可以通过包装和if来防止这种情况:
if ((my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g) {
    rename($_, $txt);
}

# or:

rename($_, $txt)
    if (my $txt = $_) =~ s/^\ | (?=\.)|[\/!#%^?*&()\\]| $//g;