在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
它可以工作,但不会查看下载中的所有子目录。我该怎么做?
答案 0 :(得分:2)
类似于(未测试!)的东西:
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 ...
替换为已找到的文件名。