Tôi muốn chuyển tên tập tin sang các chương trình khác, nhưng tất cả đều bị nghẹt thở khi tên chứa khoảng trắng.
Hãy nói rằng tôi có một tập tin được gọi.
foo bar
Làm thế nào tôi có find
thể trả lại tên chính xác?
Rõ ràng tôi muốn:
foo\ bar
hoặc là:
"foo bar"
EDIT : Tôi không muốn thông qua xargs
, tôi muốn lấy một chuỗi được định dạng chính xác ra find
để tôi có thể chuyển chuỗi tên tệp trực tiếp sang chương trình khác.
find
định dạng tên tập tin tốt; họ được viết một tên trên mỗi dòng. . .
find
để cung cấp tùy chọn xuất tên tệp theo định dạng phù hợp với trình bao. Tuy nhiên, nói chung, phần mở rộng -print0
GNU cũng find
hoạt động tốt đối với nhiều tình huống khác và bạn nên học cách sử dụng nó trong bất kỳ sự kiện nào.
ls $(command...)
không cung cấp danh sách thông qua stdin
. Nó đặt đầu ra của $(command...)
trực tiếp vào dòng lệnh. Trong trường hợp đó, nó là shell đang đọc từ c và nó sẽ sử dụng giá trị hiện tại của $IFS
để quyết định cách ghép từ đầu ra. Nói chung, bạn tốt hơn nên sử dụng xargs
. Bạn sẽ không nhận thấy một hiệu suất hit.
find -printf '"%p"\n'
sẽ thêm dấu ngoặc kép xung quanh mỗi tên được tìm thấy, nhưng sẽ không trích dẫn chính xác bất kỳ dấu ngoặc kép nào trong tên tệp. Nếu tên tệp của bạn không có bất kỳ dấu ngoặc kép nhúng nào, bạn có thể bỏ qua vấn đề: hoặc chuyển qua sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Nếu tên tệp của bạn cuối cùng được xử lý bởi shell, có lẽ bạn nên sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép (nếu không sweet$HOME
sẽ trở thành một cái gì đó như sheet/home/you
). Và điều này vẫn không mạnh mẽ đối với các tên tệp có dòng mới trong đó. Bạn muốn xử lý chúng như thế nào?
-exec
cờ vớifind
? bạn có khả năng có thể giảm bớt lỗi này và làm cho lệnh của bạn hiệu quả hơn bằng cách thực hiện-exec
thay vì chuyển nó sang các lệnh khác. Chỉ cần $ 0,02