Trong khi tôi đã sử dụng BASH được vài năm, trải nghiệm của tôi với kịch bản BASH tương đối hạn chế.
Mã của tôi là như dưới đây. Nó sẽ lấy toàn bộ cấu trúc thư mục từ trong thư mục hiện tại và sao chép nó vào $OUTDIR
.
for DIR in `find . -type d -printf "\"%P\"\040"`
do
echo mkdir -p \"${OUTPATH}${DIR}\" # Using echo for debug; working script will simply execute mkdir
echo Created $DIR
done
Vấn đề là, đây là một mẫu cấu trúc tệp của tôi:
$ ls
Expect The Impossible-Stellar Kart
Five Iron Frenzy - Cheeses...
Five Score and Seven Years Ago-Relient K
Hello-After Edmund
I Will Go-Starfield
Learning to Breathe-Switchfoot
MMHMM-Relient K
Lưu ý các khoảng trắng: -S Và for
lấy tham số từng chữ, vì vậy đầu ra của tập lệnh của tôi trông giống như thế này:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Learning"
Created Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot"
Created Breathe-Switchfoot
Nhưng tôi cần nó để lấy toàn bộ tên tệp (một dòng tại một thời điểm) từ đầu ra của find
. Tôi cũng đã thử find
đặt dấu ngoặc kép xung quanh mỗi tên tệp. Nhưng điều này không có ích.
for DIR in `find . -type d -printf "\"%P\"\040"`
Và đầu ra với dòng thay đổi này:
Creating directory structure...
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"""
Created ""
mkdir -p "/myfiles/multimedia/samjmusicmp3test/"Learning"
Created "Learning
mkdir -p "/myfiles/multimedia/samjmusicmp3test/to"
Created to
mkdir -p "/myfiles/multimedia/samjmusicmp3test/Breathe-Switchfoot""
Created Breathe-Switchfoot"
Bây giờ, tôi cần một số cách mà tôi có thể lặp lại như thế này, bởi vì tôi cũng muốn chạy một lệnh phức tạp hơn liên quan đến gstreamer
mỗi tệp trong một cấu trúc tương tự sau. Làm thế nào tôi nên làm điều này?
Chỉnh sửa: Tôi cần một cấu trúc mã cho phép tôi chạy nhiều dòng mã cho mỗi thư mục / tệp / vòng lặp. Xin lỗi nếu tôi không rõ ràng.
Giải pháp: Ban đầu tôi đã thử:
find . -type d | while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done
Điều này làm việc tốt cho hầu hết các phần. Tuy nhiên, sau đó tôi thấy rằng do đường ống dẫn đến vòng lặp while chạy trong một mạng con, nên bất kỳ biến nào được đặt trong vòng lặp sau đó đều không khả dụng khiến việc thực hiện bộ đếm lỗi khá khó khăn. Giải pháp cuối cùng của tôi (từ câu trả lời này trên SO ):
while read DIR
do
mkdir -p "${OUTPATH}${DIR}"
echo Created $DIR
done < <(find . -type d)
Điều này sau đó cho phép tôi tăng các biến có điều kiện trong vòng lặp sẽ có sẵn sau này trong tập lệnh.
/
và ký tự không thể in được. Nhưng bất cứ điều gì được cho phép ngoại trừ /
và \0
vì vậy bạn phải cho phép chúng.