2012-10-26 30 views
6

Cảm ơn bạn rất nhiều trước để giúp đỡ!Bash - for-loop cho mỗi thư mục trong một thư mục, ngoại trừ một số trong số chúng

Tôi có mã này trong bash:

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     echo $plugin'?' 
     read $plugin 
    done 

Những hoạt động như một nét duyên dáng. Đối với mỗi thư mục bên trong 'this_folder', hãy echo nó như một câu hỏi và lưu trữ đầu vào vào một biến có cùng tên. Nhưng bây giờ tôi muốn loại trừ một số thư mục, ví dụ, nó sẽ yêu cầu mọi thư mục trong thư mục đó, CHỈ nếu chúng KHÔNG có bất kỳ thư mục nào sau đây: global, plugins, và css.

Bất kỳ ý tưởng nào về cách tôi có thể đạt được điều này?

Cảm ơn!

UPDATE:

Đây là cách mã cuối cùng trông giống như:

base="coordfinder|editor_and_options|global|gyro|movecamera|orientation|sa" 

> vt_conf.sh 
echo "# ========== Base"  >> vt_conf.sh 
for d in $orig_include/@($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=y"   >> vt_conf.sh 
done 
echo ''      >> vt_conf.sh 
echo "# ========== Optional" >> vt_conf.sh 
for d in $orig_include/!($base) 
do 
    plugin=$(basename $d) 
    echo "$plugin=n"   >> vt_conf.sh 
done 

Trả lời

6

Nếu bạn có một phiên bản gần đây của bash, bạn có thể sử dụng những đống mở rộng (shopt -s extglob):

for d in this_folder/!(global|plugins|css)/ 
do  
    plugin=$(basename "$d") 
    echo $plugin'?' 
    read $plugin 
done 
+0

Đây là một tùy chọn rất tốt, nhưng cũng sẽ trả về tất cả các tệp nếu có cả thư mục và tệp trong 'this_folder'. Nếu bạn chỉ cần đặt dấu '/' ở cuối dòng 'for' (sau tiêu chí'! '), Điều này sẽ hoạt động tốt. Ngoài ra, tôi khuyên bạn nên (cho bạn và OP) kèm theo các tham chiếu đến '$ d' giữa các dấu ngoặc kép, do đó, điều này có thể bao gồm các tệp tập tin có dấu cách. –

+1

@CharlesRobertoCanato: Lời khuyên hay, tôi đã thêm đề xuất của bạn – Thor

-1

Bạn có thể sử dụng findawk để xây dựng danh sách các thư mục và sau đó lưu trữ kết quả trong một biến. Một cái gì đó dọc theo dòng này (chưa được kiểm tra):

dirs=$(find this_folder -maxdepth 1 -type d -printf "%f\n" | awk '!match($0,/^(global|plugins|css)$/)') 
for d in $dirs; do 
    # ... 
done 
+0

này sẽ phá vỡ nếu có tên file có chứa khoảng trắng hoặc ký tự đại diện vỏ ký tự mà phù hợp với một hiện tập tin. – tripleee

7

Bạn có thể sử dụng continue để bỏ qua một lần lặp của vòng lặp:

for d in this_folder/*  
    do  
     plugin=$(basename $d) 
     [[ $plugin =~ ^(global|plugins|css)$ ]] && continue 
     echo $plugin'?' 
     read $plugin 
    done 
1

Nếu bạn có nghĩa là để chỉ loại trừ các thư mục có tên là toàn cầu, css, plugin . Đây có thể không phải là một giải pháp thanh lịch nhưng sẽ làm những gì bạn muốn.

for d in this_folder/*  
do 
    flag=1 
    #scan through the path if it contains that string 
    for i in "/css/" "/plugins/" "/global/" 
    do 

    if [[ $(echo "$d"|grep "$i") && $? -eq 0 ]] 
    then 
     flag=0;break; 
    fi 
    done 

    #Only if the directory path does NOT contain those strings proceed 
    if [[ $flag -eq 0 ]] 
    then 
    plugin=$(basename $d) 
    echo $plugin'?' 
    read $plugin 
    fi 


done 
+1

Thay vì 'flag = 0; break;' bạn chỉ có thể sử dụng 'continue 2'. Sau đó xóa bỏ sau đó nếu '[[$ flag -eq 0]] ...' wrapper. – dubiousjim

+0

@dubiousjim: bạn đúng, nhưng tôi chỉ muốn làm cho kịch bản đơn giản hơn để hiểu cho OP. – askmish

Các vấn đề liên quan