Điểm:-2

Làm cách nào để đổi tên tệp trong Ubuntu, theo cách đệ quy, sử dụng grep và đổi tên không tìm thấy?

lá cờ cn

Có rất nhiều câu hỏi và câu trả lời liên quan đến cách đổi tên tệp. Tôi mới sử dụng Linux và vô số cách khả thi cũng như các kết quả khác nhau và các cấu hình khác nhau khiến tôi bối rối.

Ví dụ:

  • đổi tên hoạt động, nhưng không đệ quy
  • tiếng kêu hoạt động theo cách đệ quy, nhưng không thể được sử dụng để tìm kiếm tên tệp và thư mục, thay vì nội dung tệp
  • tìm thấy hoạt động, nhưng có một cú pháp dài xấu xí khi bạn muốn tìm kiếm bằng cách sử dụng các biểu thức chính quy.

Và cũng có rất nhiều câu trả lời trên hỏi ubuntungăn xếp chồng lên nhau không hoạt động với tôi và tôi không biết cách gỡ lỗi và khắc phục sự cố chúng.

Vì vậy, hãy tha thứ cho tôi để hỏi nó một lần nữa.

Tôi đang tìm kiếm một sự sạch sẽ, dễ nhớ cách:

Đổi tên tệp đệ quy bằng biểu thức chính quy đơn giản.

Tôi đã làm điều đó cho nội dung của các tệp bằng cú pháp này:

grep -rl search_regex | xargs sed -i 's/cũ/mới/g'

Nó hoạt động mà không có nhiều thất vọng. Nó hoạt động ra khỏi hộp. Nó chỉ hoạt động. Tôi đang tìm kiếm một giải pháp khả thi gọn gàng và sạch sẽ. Bạn co thể giup tôi được không?

muru avatar
lá cờ us
"Sạch sẽ", "dễ nhớ", "xấu xí" tất cả đều trong mắt người xem. Câu hỏi này không thể được trả lời một cách khách quan và nên được đóng lại dưới dạng dựa trên ý kiến
Saeed Neamati avatar
lá cờ cn
@muru, nó đã được trả lời.
muru avatar
lá cờ us
Tôi có thể thấy điều đó và bằng cách đánh giá chất lượng của câu trả lời được chấp nhận, những gì tôi nói vẫn đúng.
lys avatar
lá cờ nl
lys
Tìm kiếm của Google đã dẫn tôi đến đây. Câu trả lời bên dưới bằng cách sử dụng `globstar` đã giúp tôi khắc phục sự cố tương tự.
Điểm:4
lá cờ in

Không thể tìm thấy bất cứ điều gì dài và xấu về tìm thấy:

tìm thấy . -regex 'search_regex' -exec đổi tên 's/old/new/g' {} +
Saeed Neamati avatar
lá cờ cn
Nếu bạn thấy câu trả lời của @wizardpurple, bạn sẽ nhận ra rằng cú pháp này thật tệ. Tại sao tôi nên chỉ định công tắc `-regex`? Ngoài ra, tại sao `-exec` khi tôi có thể sử dụng đường ống đơn giản? Ngoài ra, `+` ở cuối là gì? Ngoài ra với `grep`, tôi có thể bỏ qua các trích dẫn đơn đó xung quanh biểu thức chính quy của mình. `tìm . | tìm kiếm grep | đổi tên 's/cũ/mới/g'`.
pLumo avatar
lá cờ in
Lập luận của bạn là sai. Tại sao đường ống tốt hơn `-exec`? Ống giới thiệu các vấn đề (xem nhận xét của tôi về câu trả lời của @ wizardpurple). Btw: Bạn không thể bỏ qua các trích dẫn xung quanh biểu thức chính quy của mình, điều này đơn giản là sai.
pLumo avatar
lá cờ in
Nếu xấu xí/phức tạp có nghĩa là *"Tôi không biết cú pháp"*, bạn có thể đúng. Tôi nghĩ rằng đường ống và `grep` phức tạp hơn, đặc biệt, khi bạn quan tâm đến các vấn đề đi kèm với nó (điều không được quan tâm trong câu trả lời của anh ấy).
Saeed Neamati avatar
lá cờ cn
xấu và phức tạp có nghĩa là sau khi đọc gần 20 câu hỏi, tôi không thể giải quyết vấn đề của mình. Sạch nghĩa là sau khi đọc một câu trả lời đơn giản, vấn đề của tôi đã được giải quyết. Tôi không nói về sự hiểu biết của tôi như là tiêu chí cho sự đơn giản. Tôi đang nói về năng suất như là tiêu chí ở đây.
pLumo avatar
lá cờ in
và tại sao lệnh `find` này không đáp ứng đủ nhu cầu của bạn về "*vấn đề của tôi đã được giải quyết*"? Điều này sạch hơn, nhanh hơn và có ít vấn đề hơn.
Saeed Neamati avatar
lá cờ cn
Mình đã nói với bạn các vấn đề ở comment trước. Tính phổ quát quan trọng. Khi tôi sử dụng `grep`, tôi không cần đặt nó trong dấu nháy đơn. Tôi đang xử lý cú pháp chung **ONE**. Tôi cũng biết rằng tôi luôn làm việc với các biểu thức chính quy.Ngoài ra, đường ống chỉ là cách dễ nhất để kết hợp các thứ. Đường ống dễ dàng hơn nhiều so với việc biết các công tắc. Đây là những lý do của tôi cho năng suất.
pLumo avatar
lá cờ in
Hãy để chúng tôi [tiếp tục cuộc thảo luận này trong cuộc trò chuyện](https://chat.stackexchange.com/rooms/126448/discussion-between-plumo-and-saeed-neamati).
vanadium avatar
lá cờ cn
Thêm dấu ngoặc kép để nó xử lý dấu cách chính xác (`"{}"`). Nếu số lượng tệp quá dài thì đối số có thể trở nên quá dài. Sử dụng `\;` ở cuối thay vì `+` sẽ ngăn chặn điều đó, nhưng nó sẽ trở nên chậm hơn: lệnh `rename` sau đó được thực thi lại mỗi lần cho từng tệp riêng lẻ. Tuy nhiên, bạn có thể xử lý số lượng tệp không giới hạn.
pLumo avatar
lá cờ in
@vanadium --> `find` quan tâm đến khoảng trống không có dấu ngoặc kép xung quanh `{}`. Tương tự đối với các đối số tối đa `find -exec ... +` sẽ cẩn thận và chỉ gửi càng nhiều đối số càng tốt.
vanadium avatar
lá cờ cn
@pLumo, vì vậy nó khá thông minh! Tốt để biết!
Điểm:2
lá cờ cn

Bạn có thể làm đổi tên đệ quy nếu đó là cú pháp bạn thích:

shopt -s sao cầu
đổi tên 's/cũ/mới/' **/*

của Bash ngôi sao địa cầu tùy chọn làm cho ** khớp 0 hoặc nhiều thư mục hoặc tệp theo cách đệ quy, vì vậy **/* sẽ đệ quy xuống toàn bộ cây thư mục. Bạn chỉ cần viết mẫu tìm kiếm của mình dưới dạng toàn cầu thay vì biểu thức chính quy. Ví dụ: để đổi tên tất cả các tệp có tên chứa foo, bạn sẽ làm:

shopt -s sao cầu
đổi tên 's/cũ/mới/' **/*foo*
Điểm:0
lá cờ cn

Bạn sẽ ít nhiều có thể giữ nguyên định dạng mà bạn đã có với grep và sed, mặc dù tôi nghĩ bạn vẫn sẽ cần một công cụ như find để cung cấp grep với các tệp để tìm kiếm.

Chỉnh sửa: cập nhật thông tin từ các bình luận. cảm ơn @pLumo và @terdon đã cho thấy nó sẽ không thành công đối với các tệp có ký tự dòng mới trong tên.

tìm/một số/thư mục -print0 | grep -zE "search_regex" | đổi tên -0 's/cũ/mới/g'
pLumo avatar
lá cờ in
Bạn nên sử dụng null làm dấu phân cách, vì dòng mới là ký tự hợp lệ cho tên tệp. Sử dụng: `find -print0`, `grep -z` và `rename -0`.
Saeed Neamati avatar
lá cờ cn
Bây giờ, điều này là sạch sẽ và đáng nhớ. Tôi đã thử nghiệm nó, và nó hoạt động đơn giản. Không cần phải thay đổi bất cứ điều gì. Cảm ơn bạn rất nhiều. `tìm . | tìm kiếm grep | đổi tên 's/cũ/mới/g'`
terdon avatar
lá cờ cn
Điều này sẽ không thành công trên tên tệp có chứa dòng mới @SaeedNeamati và wizardpurple.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.