2011-09-19 41 views
12

Tôi Looping qua file nào đó (tất cả các file bắt đầu với MOVIE) trong một thư mục với mã bash script này:Bash scripting, lặp qua tập tin trong thư mục không

for i in MY-FOLDER/MOVIE* 
do 

mà hoạt động tốt khi có những tập tin trong thư mục. Nhưng khi không có bất kỳ, nó bằng cách nào đó đi vào với một tập tin mà nó nghĩ được đặt tên là MY-FOLDER/MOVIE *.

Làm thế nào tôi có thể tránh nó vào những điều sau

do 

nếu không có bất kỳ tập tin trong thư mục?

Trả lời

11
for i in $(find MY-FOLDER/MOVIE -type f); do 
    echo $i 
done 

Tiện ích find là một trong những dao Swiss Army của Linux. Nó bắt đầu từ thư mục bạn cung cấp cho nó và tìm tất cả các tệp trong tất cả các thư mục con, theo các tùy chọn mà bạn cung cấp.

-type f sẽ chỉ tìm các tệp thông thường (không phải thư mục).

Như tôi đã viết, lệnh cũng sẽ tìm thấy các tệp trong thư mục con; bạn có thể ngăn chặn điều đó bằng cách thêm -maxdepth 1

+1

tìm là con dao quân đội swiss, đúng. nhưng sử dụng nó như một cách với vòng lặp là dễ bị thất bại khi các tập tin với không gian. –

+1

Ngoài ra, điều này sẽ chia thành 'echo $ i' kể từ khi bạn rời khỏi tôi. Xem [this] (http://stackoverflow.com/a/7039579/3076724) để biết các ví dụ về cú pháp tốt hơn. – BroSlow

13

Với tùy chọn nullglob.

$ shopt -s nullglob 
$ for i in zzz* ; do echo "$i" ; done 
$ 
+0

mã của bạn hoạt động cho tôi ngay cả khi không có tùy chọn 'nullglob', tôi đang làm gì sai? –

+0

@DenisGolomazov: Bạn có các tệp phù hợp. Hãy thử sử dụng hình cầu không khớp với tệp nào. –

+0

cảm ơn, đã hiểu. Kết quả là 'zzz *'. –

3
 
for file in MY-FOLDER/MOVIE* 
do 
    # Skip if not a file 
    test -f "$file" || continue 
    # Now you know it's a file. 
    ... 
done 
Các vấn đề liên quan