查找并替换所有子目录中的文件中的文本

时间:2015-02-02 05:39:05

标签: macos perl shell

在Mac上;我使用Hazel运行shell脚本,以便找到&替换我的下载文件夹中多个子目录中的.txt个文件中的文本。 我的script.sh文件位于其他地方(/Users/admin/Desktop

script.sh目前看起来像这样:

#!/bin/bash
cd /Users/admin/Downloads/
perl -pi -w -e 's/OldText/NewText/g;' *.txt

它可以工作,但不会查看下载中的所有子目录。我该怎么做?

2 个答案:

答案 0 :(得分:2)

使用findxargs

类似于(未测试!)的东西:

find /Users/admin/Downloads/ -type f -print0 | xargs -0 perl -pi -w -e 's/OldText/NewText/g;' 

答案 1 :(得分:2)

我不确定为什么在这种情况下你需要perl,我不确定Hazel是谁以及为什么她会运行你的shell脚本,但是因为你已经标记了你的问题{{1显然正在使用shell,我将提供一个仅限shell的答案。请注意,这也适用于其他shell,而不仅仅是bash。

bash

请注意,此#!/bin/bash find /Users/admin/Downloads/ -type f -name "*.txt" \ -exec sed -i '' -ne 's/OldText/NewText/g' {} \; 命令分为两行,以便于阅读。它使用find代替sed,因为perl更小且可能更快,并且被视为标准shell工具,而在所有系统上可能找不到sed

另请注意,我使用的perl选项的确切语法可能取决于系统上sed的实现。

sed命令的工作方式如下:

find

您可以find [path ...] [command ...] 查看详细信息,但我在此处提供的命令执行以下操作。

  • man find
  • 开始
  • /Users/admin/Downloads/ - 查找文件内容(与目录或符号链接相对)
  • -type f - 并查找与此文件规范相匹配的内容
  • -name "*.txt" - AND执行以下shell命令,将-exec ...替换为已找到的文件名。