以 Bash 扩展模式转义 @(..)
Escaping in a Bash extended pattern @(..)
我偶然发现 "Extended pattern" extglob for Bash。 http://wiki.bash-hackers.org/syntax/pattern
我正在调查此案:
想象一下这样的目录结构:
/basedir/2017/02/26/uniquedirs1/files.log
/basedir/2017/02/27/uniquedirs2/files.log
/basedir/2017/02/28/uniquedirs3/files.log
/basedir/2017/03/01/uniquedirs4/files.log
/basedir/2017/03/02/uniquedirs5/files.log
如果我想列出目录 2017/02/27
和 2017/02/28
的文件,我可以简单地写:
ls /basedir/2017/02/@("27"|"28")/*/files.log
太棒了! \o/
现在是问题。如何在 Bash 扩展模式中定义多个目录?
这不起作用:
ls /basedir/2017/@("02/28"|"03/01")/*/files.log
ls /basedir/2017/@("02\/28"|"03\/01")/*/files.log
有什么方法可以为 "Extended pattern" 定义多个目录?
路径名生成仅将模式应用于路径名组件;它们从不匹配分隔组件的 /
。大括号扩展在这里会更干净:
ls /basedir/2017/{2/28,3/01}/*/files.log
首先扩展到
ls /basedir/2017/2/28/*/files.log /basedir/2017/3/01/*/files.log
在对两个生成的模式执行路径名生成之前。
好的,我动态解决这个问题的方法是这样的:
#!/bin/bash
# User input:
start_date="2017-02-27"
day_range=2
# Logic:
declare -a 'date_range=($( echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date" ))'
#this creates an array with dates:
#2017-03-02 2017-03-01 2017-02-28 2017-02-27
eval ls "basedir/{$(IFS=\, ; echo "${date_range[*]//-//}")}/*/files.log"
#this translates to:
#ls basedir/{2017/03/01,2017/02/28,2017/02/27}/*/files.log
如果你想在不能使用文件创建日期的情况下将它与 grep 等工具一起使用来获取数据,这会更有用。
我偶然发现 "Extended pattern" extglob for Bash。 http://wiki.bash-hackers.org/syntax/pattern
我正在调查此案:
想象一下这样的目录结构:
/basedir/2017/02/26/uniquedirs1/files.log
/basedir/2017/02/27/uniquedirs2/files.log
/basedir/2017/02/28/uniquedirs3/files.log
/basedir/2017/03/01/uniquedirs4/files.log
/basedir/2017/03/02/uniquedirs5/files.log
如果我想列出目录 2017/02/27
和 2017/02/28
的文件,我可以简单地写:
ls /basedir/2017/02/@("27"|"28")/*/files.log
太棒了! \o/
现在是问题。如何在 Bash 扩展模式中定义多个目录?
这不起作用:
ls /basedir/2017/@("02/28"|"03/01")/*/files.log
ls /basedir/2017/@("02\/28"|"03\/01")/*/files.log
有什么方法可以为 "Extended pattern" 定义多个目录?
路径名生成仅将模式应用于路径名组件;它们从不匹配分隔组件的 /
。大括号扩展在这里会更干净:
ls /basedir/2017/{2/28,3/01}/*/files.log
首先扩展到
ls /basedir/2017/2/28/*/files.log /basedir/2017/3/01/*/files.log
在对两个生成的模式执行路径名生成之前。
好的,我动态解决这个问题的方法是这样的:
#!/bin/bash
# User input:
start_date="2017-02-27"
day_range=2
# Logic:
declare -a 'date_range=($( echo {'"$day_range"'..0} | xargs -I{} -d " " date -d "'"$start_date"' +{} day" --rfc-3339="date" ))'
#this creates an array with dates:
#2017-03-02 2017-03-01 2017-02-28 2017-02-27
eval ls "basedir/{$(IFS=\, ; echo "${date_range[*]//-//}")}/*/files.log"
#this translates to:
#ls basedir/{2017/03/01,2017/02/28,2017/02/27}/*/files.log
如果你想在不能使用文件创建日期的情况下将它与 grep 等工具一起使用来获取数据,这会更有用。