使用 find 和 csplit 的无效参数

Invalid parameters using find and csplit

这应该是一个简单的任务...!

我有一个包含多个 html 文件的目录。每个人都有一个 div 叫一个 class 叫 crumb。我想在 crumb 上将文件一分为二。稍后,我会将拆分文件的第二部分与新的开始部分连接起来。

所以我尝试了这个,拆分所有 html 文件 - 实际上是两个名为 news.htmlabout.html 的文件 - 在模式 crumb 上:

find *.html -exec csplit - /crumb/ {} \;

但我有这样的回应:

csplit: ‘about.html’: invalid pattern
csplit: ‘news.html’: invalid pattern

为什么文件名被解释为一种模式?

csplit命令的概要是

csplit [OPTION]... FILE PATTERN...

但是你用

csplit - PATTERN FILE

其中-是"read from standard input"(而不是文件),然后FILE被解释为一个模式。相反:

find -name '*.html' -exec csplit {} /crumb/ \;

注意 *.html 应该是单引号,或者 shell 在 find 看到它之前展开它。

您可以通过添加 'echo'

来深入了解问题
find *.html -exec echo csplit - /crumb/ {} \;

哪个会显示

csplit - /crumb/ about.html
csplit - /crumb/ news.html

运行 这些命令以交互方式产生问题中的错误:csplit: ‘about.html’: invalid pattern

查csplit man,显示用法:'csplit [OPTION]... FILE PATTERN...',说明第一个参数应该是文件名,后面是模式。从上述脚本生成的命令在模式后包含文件名。

建议的修复:

find *.html -exec  csplit  {} /crumb/ \;

# OR, with unique suffix for every file, and 3 digit suffix
find *.html -exec csplit --prefix {} --suffix-format='%03d' {} /crumb/ \;

哪个将执行:

csplit about.html /crumb/
csplit news.html /crumb/

无法判断这是否会生成请求的输出(根据需要拆分文件),因为未提供输入文件。