2017-03-10 20 views
5

Tôi tình cờ gặp "extglob" mẫu mở rộng cho Bash. http://wiki.bash-hackers.org/syntax/patternThoát trong mẫu mở rộng Bash @ (..)

Tôi đang điều tra trường hợp này:

Hãy tưởng tượng một cấu trúc thư mục như thế này:

/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 

Nếu tôi muốn liệt kê các tập tin của thư mục 2017/02/272017/02/28 tôi chỉ đơn giản có thể viết:

ls /basedir/2017/02/@("27"|"28")/*/files.log 

Tuyệt vời! \ o/

Bây giờ là câu hỏi. Làm thế nào tôi có thể xác định nhiều thư mục trong một mẫu mở rộng Bash?
này không hoạt động:

ls /basedir/2017/@("02/28"|"03/01")/*/files.log 
ls /basedir/2017/@("02\/28"|"03\/01")/*/files.log 

Có cách nào tôi có thể nhận để xác định nhiều thư mục cho "mô hình mở rộng"?

Trả lời

4

Tạo tên đường dẫn chỉ áp dụng các mẫu cho các thành phần tên đường dẫn; họ không bao giờ phù hợp với các / mà tách các thành phần. mở rộng Brace sẽ sạch hơn ở đây:

ls /basedir/2017/{2/28,3/01}/*/files.log 

đầu tiên mà sẽ mở rộng tới

ls /basedir/2017/2/28/*/files.log /basedir/2017/3/01/*/files.log 

trước khi thực hiện thế hệ tên đường dẫn trên hai mô hình kết quả.

+0

Vấn đề duy nhất với việc mở rộng cú đúp là tôi không thể xác định phạm vi động. – Asgair

+1

Bạn không thể với các mẫu mở rộng, do đó bạn không mất bất cứ thứ gì :) – chepner

+0

Ok. đó là một sự xấu hổ ... Tôi vẫn không gần gũi hơn với một giải pháp hiệu quả. Vấn đề duy nhất tôi có mặc dù là một cú đúp mở rộng không thể được xác định động. như 'var1 =" 02/28,03/01 "ls/basedir/2017 /" $ var1 "/ */files.log' trừ khi tôi thực hiện nó trong một vỏ con. Nhưng nó hoạt động: 'var2 =" 27 | 28 "ls/basedir/2017/02/@ (" $ var2 ")/*/files.log' – Asgair

0

ok, cách Tôi đã giải quyết này tự động, là như thế này:

#!/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 

này rất hữu ích hơn nếu bạn muốn sử dụng nó với các công cụ như grep để lấy dữ liệu nếu bạn không thể sử dụng tập tin -creat-date.