2011-02-04 2 views
9

Trong tập lệnh bash, tôi muốn lặp qua tất cả các thư mục trong thư mục làm việc hiện tại và thực hiện các công việc cho chúng. Chúng có thể chứa các ký hiệu đặc biệt, đặc biệt là khoảng trắng. Làm thế nào tôi có thể làm điều đó? Tôi có:Lặp qua các thư mục có khoảng trống trong Bash

for dir in $(ls -l ./) 
do 
    if [ -d ./"$dir" ] 

nhưng điều này bỏ qua các thư mục của tôi có khoảng trắng trong tên của chúng. Bất kỳ trợ giúp được đánh giá cao.

Trả lời

24

này cung cấp cho một thử:

for dir in */ 
+0

làm như vậy, nhưng tại sao? */là một ký tự đại diện cho tất cả các thư mục? – jakev

+1

Chà, điều đó thực sự hiệu quả, ngay cả trên các thư mục có dấu cách. Vì vậy, bash phải ngầm báo giá trị khi nó mở rộng ký tự đại diện? Tôi thích nó. – harpo

+0

@JakeVA: Vâng, chính xác. Lưu ý rằng nó sẽ không bao gồm các thư mục ẩn trừ khi bạn đặt 'shopt -s dotglob'. Nếu thư mục hiện tại có thể không có thư mục con, bạn cũng nên đặt 'shopt -s nullglob' (đặt nó trong trường hợp). –

8

Hãy chọn các giải pháp:

http://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html

Ý tưởng chung là thay đổi seperator mặc định (IFS).

#!/bin/bash 
SAVEIFS=$IFS 
IFS=$(echo -en "\n\b") 
for f in * 
do 
    echo "$f" 
done 
IFS=$SAVEIFS 
+0

Tôi bỏ qua đề cập đến điều này trong câu hỏi của mình, nhưng tôi đã thử điều đó. Tôi nghĩ rằng phần còn thiếu đã được lặp qua * hoặc */chứ không phải là kết quả của ls – jakev

+0

Tôi tìm thấy giải pháp của tôi ở đây, bằng cách sử dụng 'tìm. -print0 | trong khi đọc -d $ '\ 0' file' để thiết lập một vòng lặp 'do' với biến' file'. – Air

3

Có nhiều cách. Dưới đây là cái gì đó rất nhanh:

find /your/dir -type d -print0 | xargs -0 echo 

này sẽ quét/your/dir đệ quy cho các thư mục và sẽ vượt qua tất cả đường dẫn đến lệnh "echo" (trao đổi nhu cầu của bạn). Nó có thể gọi echo nhiều lần, nhưng nó sẽ cố gắng truyền nhiều tên thư mục như giao diện điều khiển cho phép cùng một lúc. Điều này cực kỳ nhanh vì vài quá trình cần phải được bắt đầu. Nhưng nó chỉ hoạt động trên các chương trình có thể lấy một số lượng tùy ý các giá trị như các tùy chọn. print0 nói tìm đến đường dẫn tập tin riêng biệt sử dụng một byte zero (và -0 kể xargs để đọc đối số phân cách bằng zero byte) Nếu bạn không có một sau, bạn có thể làm điều này:

find /your/dir -type d -print0 | xargs -0 -n 1 echo 

hoặc

find /your/dir -type d -print0 --exec echo '{}' ';' 

Tùy chọn -n 1 sẽ yêu cầu xargs không chuyển nhiều đối số hơn cùng một lúc vào chương trình của bạn. Nếu bạn không muốn tìm quét quét đệ quy, bạn có thể chỉ định tùy chọn chiều sâu để vô hiệu hóa đệ quy (không biết cú pháp bằng trái tim).

Mặc dù điều đó có thể sử dụng được trong tập lệnh cụ thể của bạn là một câu hỏi khác ;-).

+0

Lưu ý rằng xargs có các công cụ bổ sung hữu ích ở đây, như -J . Ví dụ: xargs -0 -J% mv% ~/some_other_folder –