【问题标题】:How can I check whether a piped content is text with perl如何使用 perl 检查管道内容是否是文本
【发布时间】:2012-01-23 08:46:05
【问题描述】:

我为文本文件编写了一个 svn-hook。内容测试如下所示:

svnlook cat -t $txn $repos $file 2>/dev/null | file - | egrep -q 'text$'

我想知道这是否可以用 Perl 完成。但是这样的事情不起作用:

svnlook cat -t $txn $repos $file 2>/dev/null | perl -wnl -e '-T' -

我正在测试此调用 ($?) 的退出状态,以查看给定文件是文本文件还是二进制文件。因为我是从 svn 中获取内容的。我不能使用 perl 的正常文件检查。

我已经用文件程序和 perl 用文本和二进制文件(text.txt,icon.png)进行了模拟:

find -type f | xargs -i /bin/bash -c 'if $(cat {} | 文件 - | egrep -q "text$");然后回显“{}:文本”;否则回显“{}:二进制”;呵呵

./text.txt:文本 ./icons.png: 二进制

find -type f | xargs -i /bin/bash -c 'if $(cat {} | perl -wln -e "-T;");然后回显“{}:文本”;否则回显“{}:二进制”;呵呵

./text.txt:文本 ./icons.png: 文字

【问题讨论】:

  • 欢迎来到 StackOverflow!我已经格式化了你的问题。如果您可以在您的问题(编辑)中解释您期望什么输出以及这与您得到的输出有何不同以及对您的${variables} 的描述,这将很有帮助。有关编写完美问题的更多提示,请参阅 tinyurl.com/so-hints
  • 感谢您更新这个问题。

标签: perl svn content-type


【解决方案1】:

您正在测试perl 的退出代码,但您从未设置它。你需要

perl -le'exit(-T STDIN ?0:1)' < file

【讨论】:

  • @user1164553,对不起,我犯了一些错误。我累了。现在应该都修好了。
  • 感谢您的回答。然而问题在于,在上面提到的 svn 上下文中,我只能访问内容。这就是我使用'cat'来模拟'svnlook cat'的原因。所以 perl 脚本应该只对内容起作用,而不关注文件名。
  • 我用它来得到这个结果:find -type f | xargs -i /bin/bash -c 'if $(cat {} | perl -ln -e "exit(-T _ ?0:1)"); then echo "{}: text"; else echo "{}: binary"; fi' ./text.txt: binary ./icons.png: binary跨度>
  • @user1164553,我不好,应该始终是标准输入。就像我说的,累了。比我想象的要多得多。现在去睡觉吧!
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 2016-03-31
  • 2015-09-30
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多