Các lệnh để làm bất cứ điều gì đệ quy cho cấu trúc thư mục là find
:
find . -name "*.jpg" -exec bash -c 'file="{}"; cp "$file" "${file%%.jpg}1.jpg"' \;
Sử dụng -exec
thay vì for i in $(find ...)
sẽ xử lý tên tệp có chứa khoảng trắng. Tất nhiên, vẫn còn một dấu trích dẫn; nếu tên tệp có chứa "
, thì file="{}"
sẽ mở rộng thành file="name containing "quote characters""
, rõ ràng là bị hỏng (file
sẽ trở thành name containing quote
và nó sẽ cố gắng thực hiện lệnh characters
).
Nếu bạn có tên tập tin như vậy, hoặc bạn có thể, sau đó in ra mỗi tên tập tin tách ra với các nhân vật null (mà không được phép vào tên tập tin) sử dụng -print0
, và sử dụng while read -d $'\0' i
để lặp qua các kết quả null-phân:
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do cp "$i" "${i%%.jpg}1.jpg"; done)
Như với bất kỳ lệnh phức tạp nào như thế này, bạn nên kiểm tra nó mà không cần thực hiện bất cứ điều gì để đảm bảo nó mở rộng đến một cái gì đó hợp lý trước khi chạy nó. Cách tốt nhất để làm điều này là để thêm vào trước các lệnh thực tế với echo
, vì vậy thay vì chạy nó, bạn sẽ thấy các lệnh đó nó sẽ chạy:
find . -name "*.jpg" -print0 | \
(while read -d $'\0' i; do echo cp "$i" "${i%%.jpg}1.jpg"; done)
Khi bạn đã eyeballed nó và kết quả có vẻ tốt, loại bỏ các echo
và chạy nó một lần nữa để chạy nó cho thực tế.
Nguồn
2012-11-05 03:22:30
'mọi tệp trong thư mục con của thư mục đó' = đệ quy – nickhar