Tôi có một tập lệnh bash shell lặp qua tất cả các thư mục con (nhưng không phải tệp) của một thư mục nhất định. Vấn đề là một số tên thư mục chứa khoảng trắng.
Đây là nội dung của thư mục thử nghiệm của tôi:
$ls -F test
Baltimore/ Cherry Hill/ Edison/ New York City/ Philadelphia/ cities.txt
Và mã lặp qua các thư mục:
for f in `find test/* -type d`; do
echo $f
done
Đây là kết quả:
test / Baltimore test / Cherry đồi núi test / Edison thử nghiệm / Mới York Tp. test / Philadelphia
Cherry Hill và New York City được coi là 2 hoặc 3 mục riêng biệt.
Tôi đã thử trích dẫn các tên tệp, như sau:
for f in `find test/* -type d | sed -e 's/^/\"/' | sed -e 's/$/\"/'`; do
echo $f
done
nhưng không có kết quả.
Phải có một cách đơn giản để làm điều này.
Các câu trả lời dưới đây là tuyệt vời. Nhưng để làm cho điều này phức tạp hơn - tôi không phải lúc nào cũng muốn sử dụng các thư mục được liệt kê trong thư mục thử nghiệm của mình. Đôi khi tôi muốn chuyển các tên thư mục làm tham số dòng lệnh thay thế.
Tôi lấy đề xuất của Charles về việc thiết lập IFS và nghĩ ra những điều sau:
dirlist="${@}"
(
[[ -z "$dirlist" ]] && dirlist=`find test -mindepth 1 -type d` && IFS=$'\n'
for d in $dirlist; do
echo $d
done
)
và điều này hoạt động tốt trừ khi có khoảng trắng trong các đối số dòng lệnh (ngay cả khi các đối số đó được trích dẫn). Ví dụ: gọi tập lệnh như sau: test.sh "Cherry Hill" "New York City"
tạo ra kết quả sau:
quả anh đào đồi núi Mới York Tp.
list="$@"
loại bỏ hoàn toàn list-ness của giá trị ban đầu, thu gọn nó thành một chuỗi. Vui lòng làm theo các thông lệ trong câu trả lời của tôi một cách chính xác như đã đưa ra - một bài tập như vậy không được khuyến khích ở bất kỳ đâu trong đó; nếu bạn muốn chuyển một danh sách các đối số dòng lệnh vào một chương trình, bạn nên thu thập chúng vào một mảng và mở rộng mảng đó trực tiếp.