由于目录,Ruby单行失败

时间:2011-11-17 23:49:26

标签: ruby bash shell

我有一个红宝石单行ruby1.9 -ine '#some statement' src/**。我假设,像perl一样,ruby会跳过目录(这就是我记忆中的方式)。但我收到此错误e:1:in 'gets': Is a directory。除了给它一个文件列表,还有一个快速的方法来解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

我认为它不会跳过目录,至少即使1.8.6也没有。因此,我认为唯一快速的方法是给它一个文件列表,或操纵ARGV,但它再也不是一个合适的单行。

这样的事情:

ruby -ne 'ARGV.delete_if{|s| File.ftype(s) == "directory"}; do_stuff_here' src/**

所以是的,给它一个合适的文件列表似乎是更好的解决方案。

答案 1 :(得分:1)

我相信您的假设实际上是关于{em> shell 对**的处理。 shell在命令中解释未转义的元字符。

默认情况下,

bash(1)不会递归展开**。您需要为此行为设置globstar选项:

$ ls -l /tmp
total 20
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:43 keyring-9mdW7p
drwx------ 2 gdm     gdm     4096 2011-11-17 15:43 orbit-gdm
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:44 orbit-sarnold
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:46 plugtmp
drwx------ 2 sarnold sarnold 4096 2011-11-17 15:43 ssh-ZriaCoWL2248
$ shopt -u globstar
$ echo /tmp/**
/tmp/keyring-9mdW7p /tmp/orbit-gdm /tmp/orbit-sarnold /tmp/plugtmp /tmp/ssh-ZriaCoWL2248
$ shopt -s globstar
$ echo /tmp/**
/tmp/ /tmp/keyring-9mdW7p /tmp/keyring-9mdW7p/control /tmp/orbit-gdm /tmp/orbit-sarnold /tmp/orbit-sarnold/linc-9a5-0-240e051029b41 /tmp/orbit-sarnold/linc-9ad-0-1b1412421b16c /tmp/plugtmp /tmp/ssh-ZriaCoWL2248 /tmp/ssh-ZriaCoWL2248/agent.2248

答案 2 :(得分:1)

如果你只想递归文件,那么 find(1)将是你最好的选择:

find ./src -type f | ruby1.9 -ne '#some statement'