Ngày bắt đầu khi tôi phải viết một tập lệnh BASH để đi các cây thư mục tùy ý và xem các tệp tùy ý và cố gắng xác định điều gì đó liên quan đến sự so sánh giữa chúng. Tôi nghĩ rằng nó sẽ là một ngọn núi đơn giản trong một vài giờ ! quy trình - Không phải vậy!Có một "công cụ chuyển đổi thoát" cho tên tệp và thư mục có sẵn không?
Việc gác máy của tôi là đôi khi một số kẻ ngốc - xin lỗi, người dùng đáng yêu chọn đặt dấu cách vào tên thư mục và tên tệp. Điều này khiến kịch bản của tôi thất bại.
Giải pháp hoàn hảo, ngoài việc đe dọa chém cho những người khăng khăng sử dụng không gian ở những nơi như vậy (chưa kể những kẻ đặt mã này trong hệ điều hành!), Có thể là thói quen "thoát" tên tệp và thư mục cho chúng tôi, giống như cách Cygwin có các thường trình để chuyển đổi từ unix sang định dạng tên tệp dos. Có điều gì giống như thế này trong bản phân phối chuẩn Unix/Linux không?
Lưu ý rằng cấu trúc đơn giản for file in *
không hoạt động tốt khi người ta đang cố gắng so sánh cây thư mục vì nó CHỈ hoạt động trên "thư mục hiện tại" - và trong trường hợp này các vị trí thư mục khác nhau mang lại cho nó những vấn đề riêng của nó. Vì vậy, khi làm bài tập về nhà của tôi, tôi thấy câu hỏi này Handle special characters in bash for...in loop và giải pháp đề xuất có treo lên trên khoảng trống trong tên thư mục, nhưng chỉ có thể được khắc phục như thế này:
dir="dirname with spaces"
ls -1 "$dir" | while read x; do
echo $x
done
XIN LƯU Ý: Mã isn trên' t đặc biệt tuyệt vời vì các biến được sử dụng bên trong vòng lặp while là INACCESSIBLE bên ngoài vòng lặp while. Điều này là bởi vì có một subshell ngụ ý được tạo ra khi đầu ra của lệnh ls được piped. Đây là yếu tố thúc đẩy chính cho truy vấn của tôi!
... OK, đoạn mã trên giúp ích cho nhiều trường hợp nhưng "thoát" các ký tự cũng sẽ khá mạnh. Ví dụ: dir above có thể chứa:
dir\ with\ spaces
Điều này đã tồn tại và tôi vừa xem nó?
Nếu không, có ai có đề xuất dễ dàng để viết một - có thể với sed hoặc lex không? (Tôi xa có thẩm quyền với một trong hai.)
Bash phải có một nội bộ, vì nó được sử dụng bất cứ khi nào bạn nhấn "tab", vì vậy đó có thể là điểm khởi đầu. – Ken
Tôi đồng ý và rất thích khai thác trực tiếp - nếu chỉ có một cách! Hmmm ... Có lẽ một số bạn bè nguồn mở của chúng tôi có thể coi nó là một bổ sung xứng đáng cho chính vỏ? Nó có thể được lập luận rằng bản gốc "cập nhật" để cho phép các không gian (đặc biệt) là không đầy đủ mà không có một công cụ như vậy. ... Trong khi đó, tôi không có ý tưởng làm thế nào để nhân rộng lập trình các hành động tab! Bạn? –
Tôi không chắc tôi hiểu nhu cầu của bạn là gì. Thông thường, sử dụng 'find' và vòng lặp' while' là quá đủ. Có thể bạn có thể đăng một số mã mà bạn đang gặp sự cố. –