我如何让这个perl命令也检查子文件夹?

iyfamqjs  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(158)

我正在运行Windows 10,我有一个批处理文件,它将目录更改为所需的位置,还有一个Perl命令,它通过将Enabled = 1更改为Enabled = 0来编辑其中的所有文本文件,但我不知道如何让Perl命令检查子文件夹。

@echo off
timeout 1 >nul 2>&1
cd /d D:
timeout 1 >nul 2>&1
cd "D:\MySettings"
timeout 1 >nul 2>&1
perl -wE "@ARGV = glob qq($ARGV[0]); $^I = qq(); while (<>) { s/Enabled =\K.*/ \x220\x22/g; print }" *.txt
Pause
svmlkihl

svmlkihl1#

要处理子文件夹中的文件,以及(我认为)子子文件夹中的文件,等等,所有“条目”的列表(glob)需要拆分成文件和文件夹。编辑文件,并在子文件夹中重复该过程。这通常是递归完成的,但也有其他方法。这是一个小工作要做。
当然,也有一些库用于递归遍历和处理。例如,核心File::Find(或File::Find::Rule)或Path::Iterator::Rule。但是,由于您还需要以简单的方式编辑每个文件,让我们看看一个更通用的实用程序Path::Tiny,它也有一些就地编辑文件的方法。
如果您坚持使用命令行程序(“one-liner”)

perl -MPath::Tiny -we"
    path(qq(.))->visit( sub { 
        my ($entry, $state) = @_; 
        return if not -T;
        path($entry)->edit_lines( sub { s/.../.../g } )
    }, 
    { recurse => 1 }
)"

这里visit方法对给定文件夹下的每个条目执行sub { }回调,并递归地继续(使用该选项)。我们跳过不是ASCII或UTF-8文件的条目,跳过的次数为-Tfiletest
在回调内部,edit_lines按照其sub中指定的方式处理文件的每一行;在这种情况下,运行问题中的正则表达式。一旦它完成了整个文件,它会用编辑后的版本替换原始文件。参见docs。

du7egjpx

du7egjpx2#

对于这一点,我认为它只能通过perl命令,而不是批处理命令来完成。
您可以查看here以获得更具体的解决方案

相关问题