Ruby和shell:使用ls获得相同的输出

Ruby和shell:使用ls获得相同的输出,ruby,shell,Ruby,Shell,我得到了一个包含以下zip文件的文件夹: 13162.zip 14864.zip 19573.zip 20198.zip 在控制台中,当我运行时: cd my_folder; echo `ls *{.zip,.ZIP}` 我得到了以下输出(非常完美): 现在,在ruby中,我尝试同样的方法: cmd= "cd my_folder; echo `ls {*.zip,*.ZIP}`"; puts `#{cmd}` 它只显示: ls: cannot access {*.zip,*.ZIP}: No

我得到了一个包含以下zip文件的文件夹:

13162.zip 14864.zip 19573.zip 20198.zip

在控制台中,当我运行时:

cd my_folder; echo `ls *{.zip,.ZIP}`
我得到了以下输出(非常完美):

现在,在ruby中,我尝试同样的方法:

cmd= "cd my_folder; echo `ls {*.zip,*.ZIP}`";
puts `#{cmd}`
它只显示:

ls: cannot access {*.zip,*.ZIP}: No such file or directory
 => nil
我尝试以下解决方案:

但这对我来说似乎不起作用


如何在ruby和shell中获得相同的输出?

我认为这应该直接在终端上工作:

echo 'system("ls *ZIP,*zip")' | ruby
或者创建一个包含以下内容的ruby文件

system("cd my_folder; ls {*.zip,*.ZIP}")

然后执行它。一旦你写了ls,你就不需要echo

我认为这应该直接在终端上起作用:

echo 'system("ls *ZIP,*zip")' | ruby
或者创建一个包含以下内容的ruby文件

system("cd my_folder; ls {*.zip,*.ZIP}")
然后执行它。一旦你写了ls,你就不需要echo

仅限红宝石 您可以使用
Dir.glob
File::FNM\u CASEFOLD
进行不区分大小写的搜索:

Dir.chdir 'my_folder' do
  Dir.glob('*.zip', File::FNM_CASEFOLD).each do |zip_file|
    puts zip_file
  end
end

#=> 
# 19573.zip
# 13162.zip
# 14864.zip
# 20198.zip
# 12345.zIp
paths = `find my_folder -maxdepth 1 -iname '*.zip'`.split
#=> ["my_folder/19573.zip", "my_folder/13162.zip", "my_folder/14864.zip", "my_folder/20198.zip", "my_folder/12345.zIp"]
Ruby+bash 您可以使用
find
进行不区分大小写的搜索:

Dir.chdir 'my_folder' do
  Dir.glob('*.zip', File::FNM_CASEFOLD).each do |zip_file|
    puts zip_file
  end
end

#=> 
# 19573.zip
# 13162.zip
# 14864.zip
# 20198.zip
# 12345.zIp
paths = `find my_folder -maxdepth 1 -iname '*.zip'`.split
#=> ["my_folder/19573.zip", "my_folder/13162.zip", "my_folder/14864.zip", "my_folder/20198.zip", "my_folder/12345.zIp"]
-printf“%p”
也可用于仅显示文件名:

files = `find my_folder -maxdepth 1 -iname '*.zip' -printf '%P\n'`.split
#=> ["19573.zip", "13162.zip", "14864.zip", "20198.zip", "12345.zIp"]
仅限红宝石 您可以使用
Dir.glob
File::FNM\u CASEFOLD
进行不区分大小写的搜索:

Dir.chdir 'my_folder' do
  Dir.glob('*.zip', File::FNM_CASEFOLD).each do |zip_file|
    puts zip_file
  end
end

#=> 
# 19573.zip
# 13162.zip
# 14864.zip
# 20198.zip
# 12345.zIp
paths = `find my_folder -maxdepth 1 -iname '*.zip'`.split
#=> ["my_folder/19573.zip", "my_folder/13162.zip", "my_folder/14864.zip", "my_folder/20198.zip", "my_folder/12345.zIp"]
Ruby+bash 您可以使用
find
进行不区分大小写的搜索:

Dir.chdir 'my_folder' do
  Dir.glob('*.zip', File::FNM_CASEFOLD).each do |zip_file|
    puts zip_file
  end
end

#=> 
# 19573.zip
# 13162.zip
# 14864.zip
# 20198.zip
# 12345.zIp
paths = `find my_folder -maxdepth 1 -iname '*.zip'`.split
#=> ["my_folder/19573.zip", "my_folder/13162.zip", "my_folder/14864.zip", "my_folder/20198.zip", "my_folder/12345.zIp"]
-printf“%p”
也可用于仅显示文件名:

files = `find my_folder -maxdepth 1 -iname '*.zip' -printf '%P\n'`.split
#=> ["19573.zip", "13162.zip", "14864.zip", "20198.zip", "12345.zIp"]

irb
控制台类型
cmd=`cd下载;ls*.zip*.zip`
后跟
put cmd
您想要实现什么?您的代码不是有效的ruby代码。请提供正确的代码。你考虑过使用像和这样的Ruby方法吗?Imran Ali:解决我的问题!谢谢。(Dir.chdir=>对于我必须使用的现有代码库,这是不可能的,但这当然是一个更好的主意)您正在使用大括号扩展。这是由您的交互式shell(bash)支持的,但不是由ruby使用的系统shell(可能是dash)支持的。您应该用Ruby编写,而不是使用shell,@EricDuminil展示了如何编写。从技术上讲,您可以使用sh等效的
ls*.zip*.zip
或常用的
ls*[zZ][iI][pP]
,但Eric的答案要好得多;ls*.zip*.zip`后跟
put cmd
您想要实现什么?您的代码不是有效的ruby代码。请提供正确的代码。你考虑过使用像和这样的Ruby方法吗?Imran Ali:解决我的问题!谢谢。(Dir.chdir=>对于我必须使用的现有代码库,这是不可能的,但这当然是一个更好的主意)您正在使用大括号扩展。这是由您的交互式shell(bash)支持的,但不是由ruby使用的系统shell(可能是dash)支持的。您应该用Ruby编写,而不是使用shell,@EricDuminil展示了如何编写。从技术上讲,您可以使用sh等效的
ls*.zip*.zip
或常用的
ls*[zZ][iI][pP]
,但Eric的答案要好得多。