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