Score:-2

วิธีเปลี่ยนชื่อไฟล์ใน Ubuntu แบบเรียกซ้ำโดยใช้ grep และเปลี่ยนชื่อไม่พบ

ธง cn

มีคำถามและคำตอบมากมายเกี่ยวกับวิธีเปลี่ยนชื่อไฟล์ ฉันยังใหม่กับ Linux และวิธีที่เป็นไปได้มากมายและผลลัพธ์ที่แตกต่างกันและการกำหนดค่าที่แตกต่างกันทำให้ฉันสับสน

ตัวอย่างเช่น:

  • เปลี่ยนชื่อ ใช้งานได้ แต่ไม่เรียกซ้ำ
  • เกรป ทำงานแบบวนซ้ำ แต่ไม่สามารถใช้เพื่อค้นหาชื่อไฟล์และไดเร็กทอรี แทนเนื้อหาไฟล์
  • หา ใช้งานได้ แต่มีไวยากรณ์ที่ยาวน่าเกลียดเมื่อคุณต้องการค้นหาโดยใช้นิพจน์ทั่วไป

และยังมีคำตอบมากมายเกี่ยวกับ ถามอูบุนตู และ สแต็คโอเวอร์โฟลว์ ใช้งานไม่ได้สำหรับฉันและฉันไม่รู้วิธีดีบักและแก้ไขปัญหาเหล่านี้

ดังนั้น ขออภัยที่จะถามอีกครั้ง

ฉันกำลังมองหาที่สะอาด น่าจดจำ วิธีการ:

เปลี่ยนชื่อไฟล์ซ้ำโดยใช้นิพจน์ทั่วไปอย่างง่าย.

ฉันทำไปแล้วสำหรับเนื้อหาของไฟล์โดยใช้ไวยากรณ์นี้:

grep -rl search_regex | xargs sed -i 's/เก่า/ใหม่/g'

มันใช้งานได้โดยไม่ต้องหงุดหงิดมาก มันทำงานนอกกรอบ มันใช้งานได้จริง ฉันกำลังค้นหาวิธีแก้ปัญหาที่ใช้การได้ซึ่งเรียบร้อยและสะอาด ได้โปรดช่วยฉันหน่อยได้ไหม?

muru avatar
us flag
"สะอาด", "น่าจดจำ", "อัปลักษณ์" ทั้งหมดอยู่ในสายตาของคนดู คำถามนี้ไม่สามารถตอบได้อย่างเป็นกลาง และควรปิดเป็นความคิดเห็น
Saeed Neamati avatar
cn flag
@muru มันตอบไปแล้ว
muru avatar
us flag
ฉันสามารถเห็นได้ และโดยการตัดสินคุณภาพของคำตอบที่ยอมรับ สิ่งที่ฉันพูดยังคงเป็นจริง
lys avatar
nl flag
lys
Google Search พาฉันมาที่นี่ คำตอบด้านล่างโดยใช้ `globstar` ช่วยฉันแก้ไขปัญหาเดียวกัน
Score:4
ธง in

ไม่พบสิ่งที่ยาวและน่าเกลียดเกี่ยวกับ หา:

หา . -regex 'search_regex' -exec เปลี่ยนชื่อ 's/old/new/g' {} +
Saeed Neamati avatar
cn flag
หากคุณเห็นคำตอบของ @wizardpurple แสดงว่าไวยากรณ์นี้น่าเกลียด เหตุใดฉันจึงควรระบุสวิตช์ `-regex` ทำไมต้อง `-exec` เมื่อฉันสามารถใช้ไพพ์ธรรมดาได้ นอกจากนี้ `+` ในตอนท้ายคืออะไร? นอกจากนี้ เมื่อใช้ "grep" ฉันสามารถละเว้นคำพูดเดี่ยวๆ เหล่านั้นจาก regex ของฉันได้ `หา. | ค้นหา grep | เปลี่ยนชื่อ 's/old/new/g'`
pLumo avatar
in flag
ข้อโต้แย้งของคุณผิด ทำไมไพพ์ถึงดีกว่า `-exec` ไปป์แนะนำปัญหา (ดูความคิดเห็นของฉันเกี่ยวกับคำตอบของ @wizardpurple) Btw: คุณไม่สามารถละเว้นเครื่องหมายคำพูดรอบๆ regex ของคุณได้ นี่เป็นสิ่งที่ผิด
pLumo avatar
in flag
ถ้าน่าเกลียด/ซับซ้อน หมายถึง *"ฉันไม่รู้ไวยากรณ์"* คุณอาจพูดถูก ฉันคิดว่าไปป์และ `grep` ซับซ้อนกว่า โดยเฉพาะอย่างยิ่งเมื่อคุณสนใจปัญหาที่มาพร้อมกับมัน (ซึ่งคำตอบของเขาไม่ได้สนใจ)
Saeed Neamati avatar
cn flag
น่าเกลียดและซับซ้อน หมายความว่าหลังจากอ่านคำถามเกือบ 20 ข้อแล้ว ฉันแก้ปัญหาไม่ได้ สะอาดหมายถึงหลังจากอ่านคำตอบง่ายๆ ปัญหาของฉันก็ได้รับการแก้ไข ฉันไม่ได้พูดถึงความเข้าใจของฉันเป็นเกณฑ์สำหรับความเรียบง่าย ฉันกำลังพูดถึงผลผลิตเป็นเกณฑ์ที่นี่
pLumo avatar
in flag
และคำสั่ง `find` นี้ไม่เพียงพอต่อความต้องการของคุณสำหรับ "*ปัญหาของฉันได้รับการแก้ไขแล้ว*" ได้อย่างไร สิ่งนี้สะอาดกว่า เร็วกว่า และมีปัญหาน้อยกว่า
Saeed Neamati avatar
cn flag
ฉันบอกคุณเกี่ยวกับปัญหาในความคิดเห็นที่แล้ว ความเป็นสากลมีความสำคัญ เมื่อฉันใช้ `grep` ฉันไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศเดี่ยว ฉันกำลังจัดการกับไวยากรณ์สากล **ONE** ฉันรู้ด้วยว่าฉันมักจะทำงานกับนิพจน์ทั่วไปนอกจากนี้ การวางท่อเป็นเพียงวิธีที่ง่ายที่สุดในการรวมสิ่งต่างๆ การวางท่อนั้นง่ายกว่าการรู้สวิตช์ นี่คือเหตุผลของฉันสำหรับการผลิต
pLumo avatar
in flag
ให้เรา [ดำเนินการสนทนาต่อในการแชท](https://chat.stackexchange.com/rooms/126448/discussion-between-plumo-and-saeed-neamati)
vanadium avatar
cn flag
เพิ่มเครื่องหมายคำพูดเพื่อให้จัดการกับช่องว่างได้อย่างถูกต้อง (`"{}"`) หากจำนวนไฟล์ยาวมาก อาร์กิวเมนต์อาจยาวเกินไป การใช้ `\;` ที่ส่วนท้ายแทน `+` จะป้องกันได้ แต่จะช้าลง: คำสั่ง `rename` จะถูกดำเนินการทุกครั้งอีกครั้งสำหรับแต่ละไฟล์ อย่างไรก็ตาม คุณสามารถจัดการไฟล์ได้ไม่จำกัดจำนวน
pLumo avatar
in flag
@vanadium --> `find` ใส่ใจเกี่ยวกับช่องว่างโดยไม่มีเครื่องหมายอัญประกาศล้อมรอบ `{}` เหมือนกันสำหรับอาร์กิวเมนต์สูงสุด `find -exec ... +` จะดูแลและส่งอาร์กิวเมนต์มากที่สุดเท่าที่จะเป็นไปได้เท่านั้น
vanadium avatar
cn flag
@pLumo มันค่อนข้างฉลาด! ดีแล้วที่รู้!
Score:2
ธง cn

คุณสามารถทำได้ เปลี่ยนชื่อ เรียกซ้ำถ้าเป็นไวยากรณ์ที่คุณต้องการ:

shopt -s โกลบอลสตาร์
เปลี่ยนชื่อ 's/old/new/' **/*

บาส โกลบอลสตาร์ ตัวเลือกทำให้ ** จับคู่ไดเร็กทอรีหรือไฟล์ตั้งแต่ 0 รายการขึ้นไปในลักษณะเรียกซ้ำ **/* จะเรียกซ้ำต้นไม้ไดเร็กทอรีทั้งหมด คุณเพียงแค่ต้องเขียนรูปแบบการค้นหาของคุณเป็นทรงกลมแทนนิพจน์ทั่วไป ตัวอย่างเช่น เพื่อเปลี่ยนชื่อไฟล์ทั้งหมดที่มีชื่อ ฟูคุณจะทำ:

shopt -s โกลบอลสตาร์
เปลี่ยนชื่อ 's/old/new/' **/*foo*
Score:0
ธง cn

คุณควรจะรักษารูปแบบเดียวกันกับ grep และ sed ได้ไม่มากก็น้อย แต่ฉันคิดว่าคุณยังต้องการเครื่องมืออย่าง find เพื่อจัดหาไฟล์ grep เพื่อค้นหา

แก้ไข: ปรับปรุงด้วยข้อมูลจากความคิดเห็น ขอบคุณ @pLumo และ @terdon ที่แสดงว่าจะล้มเหลวสำหรับไฟล์ที่มีอักขระขึ้นบรรทัดใหม่ในชื่อ

ค้นหา /some/directory -print0 | grep -zE "search_regex" | เปลี่ยนชื่อ -0 's/old/new/g'
pLumo avatar
in flag
คุณควรใช้ null เป็นตัวคั่น เนื่องจากบรรทัดใหม่เป็นอักขระที่ถูกต้องสำหรับชื่อไฟล์ ใช้: `find -print0`, `grep -z` และ `rename -0`
Saeed Neamati avatar
cn flag
ตอนนี้มันสะอาดและน่าจดจำ ฉันทดสอบแล้ว และมันก็ใช้งานได้จริง ไม่จำเป็นต้องเปลี่ยนแปลงอะไร ขอบคุณมาก. `หา. | ค้นหา grep | เปลี่ยนชื่อ 's/old/new/g'`
terdon avatar
cn flag
สิ่งนี้จะล้มเหลวในชื่อไฟล์ที่มีการขึ้นบรรทัดใหม่ @SaeedNeamati และตัวช่วยสร้างสีม่วง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา