【问题标题】:How do I run a perl script on multiple files and produce the same number of saved output files?如何在多个文件上运行 perl 脚本并生成相同数量的已保存输出文件?
【发布时间】:2015-06-18 22:36:47
【问题描述】:

我有一个简单的 Perl 脚本,我想在一个充满 .txt 文件的文件夹上运行它。

我阅读了How do I run a Perl script on multiple input files with the same extension? 的答案,但不明白如何实施答案。

我在 Google 上搜索过等,但不明白 perlmonks 上的答案。

在我正在使用的 Mac OS 终端上

perl myscript.pl input.txt > output.txt

但我不知道如何在一个充满 .txt 文件的文件夹上运行它。

我会满足于生成一组新的修改后的 .txt 文件(每个输入一个输出)或编辑文件并用输出覆盖输入(如果这样更容易的话)。

【问题讨论】:

  • 看核心模块 File::Find perldoc.perl.org/File/Find.html
  • 你想怎么做?您可以在 Perl 或 shell 中编写一个包装器,为给定目录中的每个文本文件调用您的程序,或者您可以修改您的 Perl 程序以处理许多文件,而不仅仅是一个文件。一种中间解决方案是重写myscript.pl 以接受任意数量的文件并使用perl myscript.pl *.txt 调用它。这样,它仍然可以像现在一样工作。选择权在您手中——没有比任何其他选项更简单的选项了
  • @NeilHWatson:File::Find 不适合处理单个目录中的所有文本文件。很可能globopendir/readdir 是最佳选择。或者,正如我所说,让 shell 使用通配符参数来查找文件
  • 更具体。你想要perl myscript.pl in1.txt > out1.txt ; perl myscript.pl in2.txt > out2.txt 的等价物吗?还是perl myscript.pl in1.txt in2.txt > out.txt?还是perl myscript.pl file1.txt > file1.txt ; perl myscript.pl file2.txt > file2.txt(假设您可以这样做而不会在处理之前破坏输入)?只有一个文件夹,还是您想在嵌套的子文件夹中递归工作? myscript.pl 是否接受多个文件名参数?您为什么不向我们展示您的尝试?
  • 有什么理由不使用perl -i.old myscript.pl *.txt?这假设脚本不会显式打开文件,而只是使用while (<>) 或等效项来读取文件,并使用print 或等效项来写入输出。 .old 是添加到文件名的后缀;您可以省略它并覆盖原件。

标签: perl command-line


【解决方案1】:

这更像是一个命令行/bash 问题而不是 perl 问题,据我了解,您希望对多个文件运行以下命令

perl myscript.pl input.txt > output.txt

最简单的方法是从终端执行以下命令

find . -name "*.txt" -exec sh -c 'perl myscript.pl {} > {}.out' \;

这将获取所有匹配*.txt的文件,并执行--exec sh -c''\;之间的命令,将{}替换为文件名。

【讨论】:

  • 嘘!人们抱怨 Perl 难以辨认!
  • {}.out 中的“占位符”不起作用,因为它不是 find 命令的一部分。
猜你喜欢
  • 2010-12-15
  • 2019-02-04
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多