2010-03-13 70 views
85

Tôi đang cố gắng lấy nội dung của một thư mục bằng cách sử dụng tập lệnh shell.Cách lấy danh sách tệp trong thư mục trong tập lệnh shell?

kịch bản của tôi là:

for entry in `ls $search_dir`; do 
    echo $entry 
done 

nơi $search_dir là một đường dẫn tương đối. Tuy nhiên, $search_dir chứa nhiều tệp có khoảng trắng trong tên của chúng. Trong trường hợp đó, tập lệnh này không chạy như mong đợi.

Tôi biết tôi có thể sử dụng for entry in *, nhưng điều đó sẽ chỉ hoạt động đối với thư mục hiện tại của tôi.

Tôi biết tôi có thể đổi sang thư mục đó, sử dụng for entry in * sau đó thay đổi lại, nhưng tình huống cụ thể của tôi ngăn tôi làm điều đó.

Tôi có hai đường dẫn tương đối $search_dir$work_dir, và tôi phải làm việc trên cả hai cùng một lúc, đọc chúng tạo/xóa các tập tin trong chúng vv

Vì vậy, tôi phải làm gì bây giờ?

PS: Tôi sử dụng bash.

+0

https: // stackoverflow.com/questions/2437452/how-to-get-the-list-of-file-in-a-directory-in-a-shell-script # new-answer – arun

Trả lời

148
for entry in "$search_dir"/* 
do 
    echo "$entry" 
done 
+1

Bạn có thể giải thích tại sao 'cho mục nhập trong" $ search_dir/* "' không hoạt động? Tại sao chúng ta cần đặt '/ *' bên ngoài dấu ngoặc kép? – mrgloom

+2

@mrgloom: Bởi vì bạn cần phải để cho shell chiếm toàn bộ ký tự đại diện. –

+2

điều này không làm việc cho tôi trên macos –

14
for entry in "$search_dir"/* "$work_dir"/* 
do 
    if [ -f "$entry" ];then 
    echo "$entry" 
    fi 
done 
9
find "${search_dir}" "${work_dir}" -mindepth 1 -maxdepth 1 -type f -print0 | xargs -0 -I {} echo "{}" 
+1

Tôi biết điều này là khá cũ nhưng tôi dường như không thể nhận được lệnh 'xargs -0 -i echo" {} "' cuối cùng, hãy giải thích cho tôi một chút? Cụ thể là phần '-i echo" {} "' làm gì? Tôi cũng đọc từ trang 'man' mà' -i' không được dùng nữa và chúng ta nên sử dụng '-I'. – drkg4b

+1

'-i' thay thế' {} 'bằng arg. –

+0

Cảm ơn! Điều này rất hữu ích, cũng cho những suy nghĩ chậm chạp như tôi nghĩ rằng '{}' là chuỗi được thay thế bằng các kết quả khớp lệnh 'find'. – drkg4b

14

Những câu trả lời khác ở đây là tuyệt vời và trả lời câu hỏi của bạn, nhưng đây là kết quả google hàng đầu cho "bash có được danh sách các tập tin trong thư mục", (mà tôi đang tìm kiếm để lưu một danh sách các file) vì vậy tôi nghĩ tôi sẽ gửi câu trả lời cho vấn đề đó:

ls $search_path > filename.txt 

Nếu bạn muốn chỉ một loại nhất định (ví dụ như bất kỳ tập tin .txt):

ls $search_path | grep *.txt > filename.txt 

Lưu ý rằng $ search_path là tùy chọn; ls> filename.txt sẽ thực hiện thư mục hiện tại.

+0

Không cần sử dụng grep để chỉ nhận các tệp .txt: 'ls $ search_path/*. Txt> filename.txt '. Nhưng quan trọng hơn, ta không nên sử dụng đầu ra của lệnh ls để phân tích các tên tập tin. –

3

Đây là một cách để làm điều đó nơi cú pháp đơn giản hơn cho tôi hiểu:

yourfilenames=`ls ./*.txt` 
for eachfile in $yourfilenames 
do 
    echo $eachfile 
done 

./ là thư mục làm việc hiện tại nhưng có thể được thay thế bằng bất kỳ con đường
*.txt lợi nhuận anything.txt
Bạn có thể kiểm tra những gì sẽ được liệt kê một cách dễ dàng bằng cách gõ lệnh ls thẳng vào thiết bị đầu cuối.

Về cơ bản, bạn tạo biến số yourfilenames chứa mọi thứ mà lệnh danh sách trả về dưới dạng phần tử riêng biệt, sau đó bạn lặp qua nó. Vòng lặp tạo ra một biến tạm thời eachfile có chứa một phần tử duy nhất của biến mà nó lặp qua, trong trường hợp này là một tên tệp. Điều này không nhất thiết phải tốt hơn các câu trả lời khác, nhưng tôi thấy nó trực quan bởi vì tôi đã quen thuộc với lệnh ls và cú pháp vòng lặp for.

0

Trên phiên bản Linux Tôi làm việc với (x86_64 GNU/Linux) công trình sau đây:

for entry in $search_dir/* 
do 
    echo $entry 
done 
Các vấn đề liên quan