วิธีหลีกเลี่ยงความต้องการในการออก“ y” หลายครั้งเมื่อลบไฟล์ที่มีการป้องกัน


52

ฉันกำลังมองหาโซลูชันที่จะใช้เป็นคำตอบของ "rm: ลบไฟล์ปกติที่ป้องกันการเขียน [x]?"

ฉันคิดว่าจะออกตัวละครตามด้วยการคืนรถหลาย ๆ ครั้งใน bashrc เราจะทำอย่างนั้นได้อย่างไร?


คุณสามารถกำหนดฟังก์ชั่น thrad นี้อาจช่วยให้คุณ: stackoverflow.com/questions/756756/...
alpert

ทำไมคุณถึงต้องการทำเช่นนี้? เป็นงานที่ไม่ชัดเจนมากที่ต้องการพิมพ์ผลตอบแทนการขนส่ง (ตรงข้ามกับการขึ้นบรรทัดใหม่) ในทุกกรณีและใน. bashrc?
l0b0

@ l0b0 คำถามแก้ไขให้มีความเฉพาะเจาะจงมากขึ้น
Iancovici

ทำไมคุณต้องการลบไฟล์ใน. bashrc งานต้นฉบับยังไม่ชัดเจน
l0b0

3
@echadromani เป็นเรื่องธรรมดามากใน SO / SE ที่จะพยายามทำความเข้าใจปัญหาเดิมเพื่อให้ทางออกที่ดีที่สุดซึ่งอาจใช้กับสถานการณ์อื่น ๆ
l0b0

คำตอบ:


75

แก้ไขตามคำถามที่อัปเดต:

เพื่อหลีกเลี่ยงการถูกถามเกี่ยวกับการลบไฟล์ให้เพิ่ม-fตัวเลือก ("บังคับ"):

rm -f /path/to/file

สิ่งนี้มีผลข้างเคียงอย่างหนึ่งที่คุณควรระวัง: หากไม่มีเส้นทางใด ๆ ที่ระบุไว้มันจะไม่รายงานสิ่งนี้และมันจะกลับมาสำเร็จ:

$ rm -f /nonexistent/path
$ echo $?
0

คำตอบเดิม:

นี่คือทางออกง่ายๆหนึ่งข้อ:

yes "$string" | head -n $number | tr $'\n' $'\r'

yesทำซ้ำสตริงใด ๆ ที่คุณให้เป็นอนันต์คั่นด้วยบรรทัดใหม่ headหยุดหลังจาก$numberเวลาและtrแปลบรรทัดใหม่เพื่อส่งคืนค่าขนส่ง คุณอาจไม่เห็นเอาต์พุตใด ๆ เนื่องจากการขึ้นบรรทัดใหม่ แต่การส่งผ่านไปยังคำสั่งนี้ (ในbash) ควรแสดงให้เห็น:

printf %q "$(yes "$string" | head -n $number | tr $'\n' $'\r')"

ผู้ใช้ที่ไม่มีbashท่อกระป๋องผลให้od, hexdumpหรือxxdที่จะเห็นกลับมาของตัวละครที่เกิดขึ้นจริง


7

ปัญหาอื่น ๆ ที่ฉันพบเป็นครั้งคราวrmคือ aliased ไปrm -iบางสิ่งเช่นนี้ใน / etc / bashrc:

alias rm='rm -i'

ในกรณีนั้นคุณสามารถทำได้unalias rmหรือคุณสามารถใช้เคล็ดลับนี้ที่ฉันค้นพบเมื่อหลายปีก่อนใส่แบ็กสแลชต่อหน้าคำสั่งที่ถูกใช้นามแฝงเพื่อละเว้นนามแฝงเพียงครั้งเดียวเช่น

\rm somefile

คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับนามแฝงผ่านบทความที่Nixcraft


5

rmถูก hardcoded เพื่อถามว่า "แบบโต้ตอบ" (แจ้งให้รอการป้อนข้อมูลของผู้ใช้) บนไฟล์ที่มีการป้องกันการเขียน มีสองวิธีในการป้องกันไม่rmให้ถาม:

rm -rf somedir

และ

rm -r --interactive=never somedir

(ทั้งยังทำงานได้โดยไม่ต้อง-rเมื่อลบไฟล์แทน dirs)

คำอธิบาย:

-fทำให้rm"ไม่สนใจไฟล์และอาร์กิวเมนต์ที่ไม่มีอยู่ไม่มีพร้อมท์"

--interactive=neverทำในสิ่งที่พูดว่า: ไม่ต้องโต้ตอบ ในคำอื่น ๆ : ไม่เคยแจ้งให้

ความแตกต่างระหว่าง-fและ--interactive=neverเป็นส่วนนี้: "ละเว้นไฟล์และอาร์กิวเมนต์ที่ไม่มีอยู่"

เปรียบเทียบ:

$ rm -rf nonexistingname
$ echo $?
0

และ

$ rm -r --interactive=never nonexistingname
rm: cannot remove 'nonexistingname': No such file or directory
$ echo $?
1

ความแตกต่างที่น่าสนใจส่วนใหญ่เมื่อเขียนสคริปต์ที่คุณไม่ต้องการrmโต้ตอบ แต่ก็ยังต้องการจัดการข้อผิดพลาด

สรุป: rm -rfในการใช้บรรทัดคำสั่ง rm -r --interactive=neverในสคริปต์ใช้


สำหรับคำตอบของคำถามที่ระบุไว้ ("วิธีหลีกเลี่ยงความต้องการในการออก" y "หลายครั้งเมื่อลบไฟล์ที่ได้รับการป้องกัน") ดูที่https://askubuntu.com/questions/338857/automatically-enter-input-in-command-line / 338860 # 338860


1

เพียงแค่ให้ใช่กับคำสั่งทั้งหมดของคุณ!

yes | rm -r /path/
yes | <command>

อย่างไรก็ตามคุณสามารถบังคับใช้-f:

rm -r -f /path

-2

ฉันก็เจอปัญหาเดียวกัน คำตอบข้างต้นเป็นเพียงไฟล์เดียว แต่ถ้าคุณต้องการเพิกเฉยใช่

คุณสามารถใช้ได้

sudo rm -r /path/to/directory

เพื่อลบไฟล์ปกติที่ป้องกันการเขียนทั้งหมด


สิ่งนี้กำลังถูกลงเนื่องจากลบไดเรกทอรีทั้งหมด สันนิษฐานว่า OP ต้องการลบไฟล์ที่มีปัญหาไม่ใช่ทุก ๆ ไฟล์ในทรีย่อยของไดเรกทอรีเดียวกัน
เจค

เฮ้ .... คุณอาจจะพูดถูก
Gopal Prasad

เฮ้ .... คุณอาจจะพูดถูก แต่ไม่ใช่ในกรณีนี้ .. ราวกับว่าผู้ใช้มีความอดทนและเวลามากมายเขาก็มีเวลาที่จะให้ 'ใช่' หลายครั้ง ... ฉันคิดว่าเขาต้องการลบไฟล์ทั้งหมดด้วยคำสั่งเดียว .. ไฟล์ที่ได้รับการป้องกันมักจะขอคำยืนยันก่อนที่จะลบไฟล์ประเภทนี้ .. ตัวอย่างหนึ่งคือในกรณีที่คุณสร้าง virtualenv และใหม่กว่าคุณต้องการลบในไพ ธ อน .. โปรดลองและคุณจะพบคำสั่ง rm เพื่อขอคำยืนยันและทุกครั้ง คุณต้องให้คำตอบ .. ฉันแก้ไขสถานการณ์ด้วยวิธีนี้แล้ว
Gopal Prasad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.