2011-12-14 42 views
11

Tôi muốn viết một shellscript sẽ lặp qua tất cả các tập tin trong một thư mục và echo "put $ {filename}". ai đó có thể chỉ cho tôi phương hướng đúng không?Shellscript Looping Thông qua tất cả các tập tin trong một thư mục

+2

Bạn đã thử gì? Phần nào của câu lệnh 'for' và toán tử' * 'gây nhầm lẫn cho bạn? Bạn có thể cụ thể hơn về những gì bạn biết và những gì bạn không biết về vỏ không? –

+0

Chỉ cần đi qua này - một cảnh báo cho bất cứ ai sử dụng này như là một tài liệu tham khảo - câu trả lời không xử lý tên tập tin với không gian đúng ... tham khảo https://stackoverflow.com/questions/7039130/iterate-over-list- của các tập tin-với-không gian cho một giải pháp tốt hơn !!! – blackghost

Trả lời

15
for filename in *; do echo "put ${filename}"; done 
+1

Nếu thư mục hiện tại bị trống, kết quả đầu ra "đặt *" thay vì xuất hiện chính xác không có gì. Nó có thể được sửa? – JWWalker

3

đệ quy, bao gồm các tệp trong thư mục con?

find dir -type f -exec echo "put {}" \; 

chỉ các tệp trong thư mục đó?

find dir -maxdepth 1 -type f -exec echo "put {}" \; 
+0

Tôi gặp lỗi 'find' dir ': Không có tập tin hoặc thư mục nào như vậy khi thử. – gbmhunter

+1

Silly me, bởi dir bạn có nghĩa là thay thế bằng thư mục bạn muốn. Tuy nhiên, hơi khó hiểu! – gbmhunter

5
for file in *; do 
    echo "put $file" 
done 

Hoặc, nếu bạn muốn bao gồm các thư mục con:

find . -type f -exec echo put {} \; 

Nếu bạn muốn bao gồm các thư mục mình, đưa ra các phần -type f.

1

Thêm một lựa chọn sử dụng lssed:

$ ls -1 <dir> | sed -e 's/^/put /' 

và sử dụng lsxargs:

$ ls -1 <dir> | xargs -n1 -i%f echo 'put %f' 
+0

+1, nhưng -1 là không cần thiết và bạn có thể làm sed -e 's/^/put /' –

+0

@WilliamPursell Cảm ơn, tôi đã cập nhật phản hồi của tôi. Bằng cách nào đó, tôi hiểu lầm và làm niềng răng và đồng đô la ký một phần của giải pháp. Ngoài ra, tôi còn một giải pháp khác với 'xargs' và' echo', nhưng giải pháp 'sed' vẫn còn ngắn gọn hơn. – jcollado

0

này sẽ làm việc cũng đệ quy nếu bạn có bất kỳ thư mục con và các tập tin bên trong chúng:

find . -type f|awk -F"/" '{print "put ",$NF}' 
2

Nếu y Bạn không có bất kỳ tệp nào, sau đó thay vì in * chúng tôi có thể thực hiện việc này.

format=*.txt 
for i in $format; 
do 
if [[ "$i" == "$format" ]] 
then 
    echo "No Files" 
else 
    echo "file name $i" 
fi 
done 
Các vấn đề liên quan