2012-02-04 27 views
6

tôi sử dụng kịch bản Bash Shell sau vào danh sách các ".txt" file đệ quy trong thư mục hiện hành:file danh sách Bash Shell sử dụng "cho" vòng

#!/bin/bash 
for file in $(find . -type f -name "*.txt") 
do 
    echo $file 
    # Do something else. 
done 

Tuy nhiên, một số các file ".txt" dưới thư mục hiện tại có dấu cách trong tên của chúng, ví dụ "test.txt của tôi". Danh sách bị hỏng, ví dụ: "Testing.txt của tôi" được liệt kê như

my 
testing.txt 

Dường như "cho" vòng lặp sử dụng "không gian trắng" (không gian, \ n vv) để tách các danh sách tập tin nhưng trong trường hợp của tôi, tôi muốn sử dụng chỉ "\ n" để tách danh sách tệp.

Có cách nào tôi có thể sửa đổi tập lệnh này để đạt được mục đích này hay không. Bất kỳ ý tưởng.

Xin cảm ơn trước.

+0

Trong bash, tôi nghĩ bạn sử dụng 'find ... -print0' và' IFS = "\ 0" ', hoặc các từ xa. Chắc chắn có những câu hỏi khác về chủ đề này. –

Trả lời

7

Nếu bạn đang sử dụng bash 4, chỉ cần sử dụng một glob:

#!/bin/bash                  

shopt -s globstar 

for file in **/*.txt 
do 
    if [[ ! -f "$file" ]] 
    then 
     continue 
    fi 
    echo "$file" 
    # Do something else.               
done 

Đảm bảo báo giá "$file" hoặc bạn sẽ gặp phải vấn đề tương tự ở nơi khác. ** sẽ đệ quy đệ quy các tệp và thư mục nếu bạn đã bật globstar.

+0

Cảm ơn. Nó hoạt động cho trường hợp của tôi. – user1129812

7

Có, có find tách riêng tên tệp bằng NUL và sử dụng read để phân định trên NUL. Điều này sẽ lặp thành công trên bất kỳ tên tệp nào vì NUL không phải là một ký tự hợp lệ cho tên tệp.

#!/bin/bash 
while IFS= read -r -d '' file; do 
    echo "$file" 
    # Do something else. 
done < <(find . -type f -name "*.txt" -print0) 

Ngoài ra, nếu các # do something else không phải là quá phức tạp, bạn có thể sử dụng tùy chọn -execfind 's và không phải lo lắng về đúng phân chia ranh giới

+0

Cảm ơn. Nhưng phương pháp này dường như ít quen thuộc hơn với tôi. Tôi sẽ thử nó sau. – user1129812

+1

Việc sử dụng thành ngữ của 'find' là một cái gì đó như thế này. Vấn đề với 'cho tệp trong $ (find ...)' là chính xác là nó sẽ phân chia trên khoảng trắng. Thay vào đó, hãy sử dụng 'find ... | trong khi đọc tập tin'. Các tùy chọn bổ sung để 'đọc' được yêu cầu để đối phó đúng với tên tập tin ngay cả với dòng mới, nhưng nếu tất cả bạn cần phải đối phó với là không gian, bạn có thể là một chút flimsier. – tripleee

+0

Phương pháp này là giải pháp thay thế tốt cho trường hợp của tôi vì nó cho phép tên tệp có thể cho phép tùy ý. Phương pháp này hiện đã được kiểm tra OK và cũng hoạt động cho trường hợp của tôi. – user1129812

Các vấn đề liên quan