Ruby和shell:使用ls获得相同的输出
我得到了一个包含以下zip文件的文件夹: 13162.zip 14864.zip 19573.zip 20198.zip 在控制台中,当我运行时: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
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的答案要好得多。