ป้องกันผู้ใช้พิมพ์ช่องว่างโดยไม่ได้ตั้งใจระหว่าง rm และ wildcard


29

ความตั้งใจที่:

rm -rf string*

ปัญหา:

rm -rf string *

กรณีแรกคือการใช้ rm ที่ถูกต้องและเป็นเรื่องธรรมดาการพิมพ์ผิดขนาดเล็กอาจทำให้เกิดปัญหามากมายในกรณีที่สอง มีวิธีง่าย ๆ ในการป้องกันรอยต่อที่ไม่ตั้งใจหรือสัญลักษณ์ตัวแทนชั้นนำหรือไม่?


8
ด้วยเชลล์ที่เพิ่งได้รับการกำหนดค่าและดี ( zshหรือbash) ฉันอยากจะใช้นิสัยในการกดปุ่มแท็บ (เพื่อทริกเกอร์การทำให้สมบูรณ์อัตโนมัติ) ก่อนกดปุ่มย้อนกลับ
Basile Starynkevitch

2
touch -- -iจะสร้างไฟล์-iที่จะถูกส่งไปrmเป็นพารามิเตอร์-iเมื่อคุณใส่ไวด์การ์ดในอาร์กิวเมนต์ของคุณ
Reinstate Monica - M. Schröder

@ MartinSchröder: ถ้าคุณบังเอิญอยู่ในไดเรกทอรีที่มีไฟล์อยู่
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

@ rm *MartinSchröderที่จะทำงานถ้าคุณพิมพ์ หากคุณ Typ ก็จะขยายตัวออกไปrm name * จะไม่ได้รับการประมวลผลเป็นตัวเลือกเนื่องจากไม่ใช่ก่อนหน้าชื่อไฟล์ rm name -i other names-i
Barmar

1
โดยทั่วไปผู้ใช้จะทำเพียงครั้งเดียว
tedder42

คำตอบ:


37

DEBUGดักสามารถเขียนเพื่อยกเลิกคำสั่งที่ดูน่าสงสัย สามารถเพิ่มรหัสต่อไปนี้หรือรหัสที่คล้ายกับของคุณ~/.bashrc:

shopt -s extdebug
checkcommand() {
  if [[ $BASH_COMMAND = 'rm -r'*' *' ]]; then
    echo "Suppressing rm -r command ending in a wildcard" >&2
    return 1
  fi
  # check for other commands here, if you like
  return 0
}
trap checkcommand DEBUG

ปรับตรรกะเพื่อลิ้มรส

(ฉันไม่ได้คาดหวังว่าวิธีการนี้มีประโยชน์ - มีหลายวิธีในการทำให้คำสั่งเสียหายเพื่อค้นหาพวกเขาทดสอบแบบหนึ่งต่อหนึ่ง แต่มันให้คำตอบที่แท้จริงสำหรับคำถาม)


47

ไม่มีวิธีใดที่ระบบกันกระสุนได้ทั้งหมด และเพิ่ม "คุณแน่ใจหรือไม่?" การกระตุ้นให้สิ่งต่าง ๆ เป็นไปในทางตรงกันข้ามและนำไปสู่ ​​"แน่นอนฉันแน่ใจ" ปฏิกิริยาหัวเข่า

เคล็ดลับที่ฉันหยิบขึ้นมาจากหนังสือเล่มหนึ่งในรอบหลายปีที่ผ่านมาคือการทำls -R blah*ก่อนทำ rm -fr blah* เฉพาะในกรณีที่รายชื่อที่ปรากฏขึ้นอย่างที่ฉันต้องการ

ก็พอที่ง่ายที่จะทำlsคำสั่งแรกแล้วลบและแทนที่ด้วย ls -Rrm -fr

คำถามสุดท้ายคือ "ถ้าข้อมูลมีค่าสำหรับคุณข้อมูลสำรองของคุณอยู่ที่ไหน"


4
แทนที่จะลูกศรขึ้นคุณสามารถใช้^ls -R^rm -rf^และอาจจะตั้งเป็นชื่อแทน
exussum

FWIW นี่คือls -Rสิ่งที่ฉันทำอยู่ตลอดเวลา แต่โดยสัญชาตญาณในจุดนี้มันทำให้จิตใจของฉันรู้สึกตัวเมื่อฉันตอบคำถาม ดังนั้น +1 สำหรับสิ่งนั้น
JakeGould

นี่ยังมีข้อดีที่จะไม่เป็นอันตรายหากคุณกดปุ่ม Enter หรือชนเมาส์และวางสิ่งที่มีบรรทัดใหม่ บางครั้งฉันใส่สิ่งที่อยู่ในคำสั่งซื้อที่มีประสิทธิภาพน้อยลงเพียงเพื่อความปลอดภัยมากขึ้นเช่นจากนั้นกลับไปในและวางหรืองัดชื่อไฟล์ก่อนcat > .log .logดังนั้นฉันไม่มีจุด> valuablefileบน cmdline
Peter Cordes

ฉันใช้ rm เป็น aliased rm -iดังนั้นฉันมักจะเขียนคำสั่ง rm ของฉันแล้วใส่\ จุดเริ่มต้นของบรรทัด ( \rmหลีกเลี่ยง alias-expansion สำหรับ rm เนื่องจากเป็นส่วนหนึ่งของคำที่ถูกอ้างถึง) ถ้าฉันต้องการ a -rหรือ-fใช่บางครั้งฉันก็เริ่มต้นด้วยlsแทนที่จะเป็นrmหรือเพียงแค่ออกจาก-rfส่วน (แก้ไขวิธีการที่คุณจะได้รับเครื่องหมายรหัสการจัดรูปแบบ bquote bslash bslash bquote ล้มเหลว.
ปีเตอร์ Cordes

8

คุณสามารถฝึกฝนตัวเองให้ใช้พูดrmrfแทนได้rm -rfไหม?

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

rmrf() { echo rm -rf "$@"; read -p "Proceed (y/N)? "; [ "${REPLY,,}" = y ] && rm -rf "$@"; }

ในการทำให้ฟังก์ชั่นนี้ถาวรให้เพิ่มบรรทัดนี้ไปยัง~/.bashrcไฟล์ในคอมพิวเตอร์แต่ละเครื่องที่คุณใช้

เปรียบเทียบกับrmนามแฝงทั่วไป

เป็นเรื่องปกติที่จะกำหนดนามแฝง:

alias rm='rm -i'

ข้อ จำกัด นี้มีสองข้อ:

  1. หากคุณขึ้นอยู่กับนามแฝงนี้คุณจะต้องตกใจเมื่อคุณอยู่ในเครื่องหรือในสภาพแวดล้อมที่ไม่มี ในทางตรงกันข้ามการพยายามรันrmrfบนเครื่องที่ไม่มีฟังก์ชั่นนั้นจะไม่ส่งผลร้ายcommand not foundใด ๆ

  2. นามแฝงนี้ไม่ได้ช่วยในกรณีของคุณเนื่องจาก-fตัวเลือกที่คุณระบุในบรรทัดคำสั่งจะแทนที่-iตัวเลือกในนามแฝง


4
ไม่ใช่ความคิดที่เลว แต่ขึ้นอยู่กับฟังก์ชั่นนี้ที่ติดตั้งและพร้อมใช้งานในระบบใด ๆ ที่ผู้ใช้รายนี้ใช้งาน ดังนั้นสมมติว่าพวกเขาเข้าสู่เซิร์ฟเวอร์ระยะไกลสำหรับงานบางอย่างและเรียกใช้rm -rfคำสั่งที่ผิดจะเกิดอะไรขึ้น การสร้างฟังก์ชั่นหลอกแบบนี้ท้ายที่สุดก็แค่แก้ปัญหาง่าย ๆ : ระวังให้มากขึ้นและเข้าใจว่าการอนุญาตคืออะไร
JakeGould

4
@JakeGould และไม่ได้ใช้ RM -f เว้นแต่คุณจริงๆต้อง
CVn

1
ทำไมต้องกังวลrmrfเมื่อเทียบกับการสร้างฟังก์ชันเชลล์rmที่ตรวจสอบอาร์กิวเมนต์-rหรือ-rfและใช้ตรรกะพิเศษในกรณีนั้นมิฉะนั้นการโทรโดยตรงcommand rm "$@"เพื่อเรียกใช้rmคำสั่งจริง
ชาร์ลส์ดัฟฟี่

3
คุณใช้ชื่ออื่นดังนั้นคุณจะไม่ยิงตัวเองในขณะที่การแทนที่ของคุณไม่มีอยู่ และผมเห็นด้วยกับ @ MichaelKjörlingคุณไม่จำเป็นถ้าคุณไม่ได้มี-f -iการปิดการปล่อย-fให้เตือนล่วงหน้าก่อนที่จะลบไฟล์แบบอ่านอย่างเดียว
Peter Cordes

6

ถ้าผมอยู่ในสถานการณ์ที่การลบไฟล์ผิดเป็นเรื่องใหญ่จริงๆหนึ่งในสิ่งที่ผมเคยทำคือการสร้างโฟลเดอร์ถังขยะเหมือนmkdir trashcanและแล้วฉันมีสคริปต์rmTrashcanที่มีrm -rf trashcan/*หรือrm -rf *หรือคล้ายกันเขียนอย่างระมัดระวังและ ตรวจสอบหลายครั้ง

ด้วยวิธีนี้ถ้าฉันทำผิดพลาดความผิดพลาดนั้นอยู่ที่mvคำสั่งไม่ใช่rmคำสั่ง เมื่อฉันทำlsและฉันมั่นใจว่าสิ่งที่ฉันลบเป็นrmTrashcanจริงไม่ทำงานสกปรกได้อย่างปลอดภัย

มันสะดวกอย่างยิ่งสำหรับสถานการณ์ที่ฉันต้องลบข้อมูลสำรอง ฉันสามารถmvสำรองข้อมูลทั้งเดือนลงในถังขยะได้mvไม่กี่ครั้งที่ฉันต้องการเก็บไว้ (วันที่ 1 ของเดือนที่ 15 ของเดือน) กลับไปที่การสำรองข้อมูลจากนั้นrmTranshcanส่วนที่เหลือ การทำคำสั่งที่คล้ายกันนั้นทำได้ยากด้วยrmตัวของมันเองและทำอย่างนี้ทำให้lsการสำรองข้อมูลของฉันมีความมั่นใจในไฟล์ที่ฉันทิ้งไว้ (แทนที่จะเป็นแค่การแจกแจงไฟล์ที่ฉันตั้งใจจะลบ)


4

แทนที่จะรบกวนคำสั่งสองคำ ( lsและrm) ฉันคิดว่าวิธีที่ง่ายและง่ายกว่าคือการใช้find:

find . -maxdepth 1 -name "string*" -delete

หากคุณพิมพ์โดยไม่ตั้งใจ"string *"มันจะลบไฟล์ที่มีชื่อstring charsและstring letters(ซึ่งเป็นสิ่งที่คุณต้องการอยู่แล้ว) แต่มันจะไม่จับทุกไฟล์เหมือน*ในเชลล์

นอกจากนี้คุณยังสามารถออกจาก-deleteเพื่อดูว่าจะลบไฟล์ใดจากนั้นกดลูกศรขึ้นและพิมพ์-deleteได้ง่ายกว่าการพิมพ์^ls -R^rm -rfหรือเรื่องไร้สาระอื่น ๆ


A findจะทำการค้นหาไฟล์ที่ตรงกับซ้อนกันแทนที่จะเป็นเพียงพารามิเตอร์ที่ชัดเจนที่ประกาศไว้ใน commandline ฉันคิดว่านี่พลาดเครื่องหมาย ฉันอาจจะผิด
killermist

3

มีวิธีง่าย ๆ ในการป้องกันรอยต่อที่ไม่ตั้งใจหรือสัญลักษณ์ตัวแทนชั้นนำหรือไม่?

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

ความหมายนี้เป็นปัญหาส่วนติดต่อผู้ใช้ทั้งหมดแม้ว่าจะอยู่ในระดับข้อความ / บรรทัดคำสั่ง คุณคาดหวังว่าจะมีตาข่ายนิรภัยกี่แห่งเพื่อปกป้องคุณจากการทำสิ่งที่คุณไม่ควรทำ มันเหมือนกับกรรไกรคู่หนึ่ง: ถ้าคุณประมาทและลื่นไถลและตัดมือของคุณในขณะที่ตั้งใจจะตัดผ้าหรือกระดาษใครเป็นคนผิด หรือแม้กระทั่งสัญญาณไฟจราจรและป้ายหยุด: ไม่มีอะไรจะหยุดคนขับรถจากการใช้ไฟหรือละเว้นสัญญาณไฟจราจรอื่น ๆ นอกเหนือจากการรับรู้แบบเฉียบพลันของสิ่งที่อาจเกิดขึ้นหากพวกเขามีส่วนร่วมในพฤติกรรมเสี่ยงดังกล่าว

นั่นคือทางออกที่ดีที่สุดและสมจริงที่สุดคือการให้สิทธิ์ระบบสำหรับผู้ใช้และกลุ่ม นั่นคือเครือข่ายความปลอดภัยที่ดีที่สุด / แท้จริงเท่านั้นเพื่อปกป้องผู้ใช้จากตัวเอง

หากคุณกำลังทำงานกับระบบที่คุณเป็นคนเดียวที่เข้าถึงมันคุณอาจถูกล่อลวงให้ทำchmod 777ทุกอย่าง แต่นั่นไม่ใช่วิธีที่ระบบมีเหตุผลตั้งค่า สิทธิ์ควรเป็นสิ่งที่ต้องการ755สำหรับไดเรกทอรีทั้งหมดและ644ไฟล์ที่ไม่สามารถเรียกใช้งานได้ทั้งหมด ไฟล์ที่ใช้งานได้ควรมี755อย่างน้อยที่สุดแม้ว่า744คุณจะต้องการให้คนอื่นอ่าน แต่ไม่ได้รันไฟล์ก็ตาม


2

ลองเขียนrmคำสั่งเริ่มต้นโดยไม่-fตั้งค่าสถานะ แต่ใช้-iแทนซึ่งrmจะแจ้งให้คุณทราบสำหรับแต่ละไฟล์ที่ตั้งใจจะลบ สำหรับการลบแบบเรียกซ้ำขนาดเล็กคุณสามารถกดyแป้นค้างไว้เมื่อคุณแน่ใจว่าคำสั่งนั้นพิมพ์อย่างถูกต้อง สำหรับการลบขนาดใหญ่คุณสามารถยกเลิกการดำเนินงานและประวัติการใช้ commandline ระมัดระวังเปลี่ยนไป-i-f


คุณต้องกดy[RETURN]ทุกไฟล์จริงๆไม่มีอะไรที่คุณสามารถกดค้างไว้กับ GNU rm การแก้ไข-iคือวิธีที่จะไปเมื่อคุณพิมพ์คำสั่งอย่างถูกต้อง จากนั้นคุณจะได้รับพรอมต์เฉพาะไฟล์อ่านอย่างเดียวและอาจเป็นอย่างอื่น
Peter Cordes

1
เพียงแค่ใช้rm -Iเพื่อให้ระบบแจ้งเตือนเพียงครั้งเดียวเท่านั้นและสำหรับการลบที่อาจเป็นอันตราย (เช่นไฟล์จำนวนมาก)
Nick Matteo

1
ในฟอรัมที่สร้างสรรค์น้อยคำตอบของฉันน่าจะมีอะไรบางอย่างตามสายของ "ถ้าการพิมพ์ / การพิสูจน์อักษรของคุณแย่มากคุณไม่มีธุรกิจใช้ 'rm -rf' กับ wildcards" ฉันไม่รู้สวิตช์ -I ... ต้องถูกวางไว้ใน <20 ปีก่อน; 'การแข่งขันครั้งสุดท้ายที่ฉันทำ' man rm ' :)
Nevin Williams

2

rm มี-iและตั้ง-Iค่าสถานะเพื่อยืนยันก่อนการลบทุกครั้ง ในอดีตการกระจายบางอย่างได้เปิดไว้ตามค่าเริ่มต้น นี่เป็นความคิดที่แย่มาก ให้กล่องโต้ตอบการยืนยันมากเกินไปสำหรับผู้ใช้สำหรับการทำงานปกติและพวกเขาจะเริ่มยืนยันพวกเขาอย่างเป็นปกติวิสัย สิ่งนี้จะเปลี่ยนความต้องการเป็น "ระวัง" (ธงสีแดงเสมอ) ไปยังกล่องโต้ตอบใหม่และน่ารำคาญกว่า "ใช่ใช่ใช่ใช่! ใช่พระเจ้าเจ้ากรรมคอมพิวเตอร์โง่ ๆ เพียงแค่ลบไฟล์ YESYESYESYESYESYES - CRAP ฉันหมายถึงไม่! NOOOOOOO!" นี่คือ "ใช่ แต่ฉันหมายถึงไม่มี" ปัญหาการโต้ตอบ คำตอบนี้ให้คำอธิบายภาพว่าทำไมกล่องโต้ตอบการยืนยันถึงมาผิดเวลา

ข้อผิดพลาดที่คุณอธิบายนั้นเป็นแบบลื่น "ประสิทธิภาพของการกระทำที่ไม่ใช่สิ่งที่ตั้งใจไว้" ผู้ใช้มักจะรับรู้ถึงข้อผิดพลาดในทันทีและรู้วิธีการแก้ไข น่าเสียดายที่ Unix ไม่ได้ให้โอกาสแก่ผู้ใช้ rm จะลบไฟล์ทันที ระบบปฏิบัติการอื่น ๆ แก้ปัญหานี้ได้ด้วยการอนุญาตให้ทำการลบออกอย่างน้อยก็ซักพักโดยใช้ถังขยะ

มีระบบถังขยะต่างๆสำหรับ Unix เป็นและคำตอบนี้จะเต็มไปด้วยข้อเสนอแนะ

คำถามคือนามแฝง RM หรือไม่นามแฝง RM ข้อดีในการใช้นามแฝง RM ...

  1. คุณไม่สามารถทำให้ลืมที่จะใช้ทางเลือก rm

ข้อเสียของนามแฝง RM ...

  1. คุณอาจต้องพึ่งพาระบบที่ไม่มีอยู่
  2. อาจทำให้เกิดปัญหาเมื่อดิสก์ใกล้เต็ม
  3. ต้องการโครงสร้างพื้นฐานเพื่อล้างถังขยะเป็นระยะ
  4. ต้องแน่ใจว่าจะไม่เข้าไปยุ่งกับพฤติกรรมที่คาดหวังของ rm ในโปรแกรม
  5. อาจไม่ได้จำลอง rm อย่างเต็มที่

หากคุณทำตามอาร์กิวเมนต์แรกมากเกินไปคุณจะใช้ vi (ไม่ใช่ vim, vi), csh (ไม่ใช่ tcsh, csh) และยูทิลิตี้โบราณอื่น ๆ เพราะมันมีอยู่ทั่วไป ยังคงมีอันตรายจากการโอเวอร์คล็อกสภาพแวดล้อมของคุณ ฉันชอบที่จะใช้สาธารณูปโภคของฉันกับฉันและเพื่อให้ง่ายที่สุด YMMV

สองและสามเป็นปัญหาทางเทคนิค พวกเขาจะสามารถแก้ไขได้กับงานที่เกี่ยวฉลาดที่จะตรวจสอบขนาดของถังขยะและทำความสะอาดเป็นระยะ ๆ สิ่งที่ขึ้นคล้ายกับtmpreaper นี่อาจเป็นงาน cron หรือรุ่นที่ฉลาดกว่าสามารถใช้ประโยชน์จากโครงสร้างพื้นฐานของระบบไฟล์ที่มีอยู่ในการกระจาย Linux บนเดสก์ท็อป นี่ไม่ใช่เรื่องง่ายและยากที่จะทำอย่างมีประสิทธิภาพ มันจะดีกว่าที่จะหาระบบที่มีอยู่กว่าที่จะลองทำด้วยตัวเอง

ข้อที่สี่สามารถจัดการได้โดยการสร้างเชลล์นามแฝงใหม่ของคุณalias rm='trash'จากนั้นจะไม่มีผลกับโปรแกรม

ข้อที่ห้าเป็นปัญหาที่ฉันปล่อยให้ผู้อ่านแก้ได้ rm ไม่มีสวิตช์จำนวนมาก


ฉันใช้นามแฝงของอาrm -iร์เอ็ม แต่บ่อยครั้งที่ฉันใช้\rmเพื่อให้ได้พฤติกรรมที่ไม่เป็นที่นิยม ฉันพิมพ์rm -iทุกครั้งที่ฉันวางแผนที่จะปฏิเสธสิ่งใดสิ่งหนึ่ง บางครั้งฉันเริ่มต้นคำสั่งด้วยคำสั่งlsเป็นคำสั่งจากนั้นใส่ \ rm เมื่อฉันทำเสร็จแล้วเท่านั้น ดังนั้นจึงไม่มีวิธีที่ฉันสามารถตีกลับrm -rf /แทนโดยไม่ได้ตั้งใจ/.../file
Peter Cordes

rm -Iหรือrm --interactive=onceอยู่ไกลไกลที่น่ารำคาญน้อยกว่าrm -iและยังคงจับ aything อันตราย (เพียงแจ้งเมื่อมีมากกว่า 3 ไฟล์หรือถ้ามันเป็น recursive และเพียงครั้งเดียวแทนสำหรับแต่ละไฟล์.)
นิคมัตเตโอ

@ Kundor ใช่แล้วมันไม่เปลี่ยนสมการ มันอาจทำให้มีโอกาสมากขึ้นที่ผู้ใช้จะไม่สนใจมัน ผู้ใช้มีเป้าหมาย: ลบสิ่งต่างๆ ข้อความแจ้งเตือนว่า "คุณแน่ใจหรือว่าต้องการลบสิ่งที่คุณเพิ่งบอกให้ฉันลบ" ผู้ใช้ยังคงจับจ้องอยู่ที่เป้าหมายของการลบสิ่งต่าง ๆ ไม่ตรวจสอบสิ่งที่จะถูกลบดังนั้นพวกเขาจึงพูดว่า "ใช่" โดยไม่ต้องคิด -iอาจให้เวลาผู้ใช้ในการเปลี่ยนเป้าหมาย คำตอบสำหรับคำถามที่เกี่ยวข้องนี้วางไว้หมดแล้ว
Schwern

@Schwern: แต่ไม่มีใครสามารถอยู่ด้วยได้rm -iนานกว่า 30 วินาทีโดยไม่ต้องปิด โดยที่rm -Iจะแจ้งก็ต่อเมื่อมีโอกาสที่คุณจะเมาเท่านั้น พรอมต์จะปรากฏขึ้นสำหรับการลบครั้งใหญ่เท่านั้น เมื่อคุณพยายามลบสองสามสิ่งและได้รับพรอมต์คุณจะรู้สึกประหลาดใจและรู้ว่าคุณพิมพ์ "foo *" โดยไม่ตั้งใจ
Nick Matteo

@Kundor การลบไฟล์มากกว่าสามไฟล์และการลบแบบเรียกซ้ำ (การยืนยันถูกปิดใช้งานโดยที่-rfฉันเพิ่งค้นพบเป็นประจำ) เป็นพร็อกซีที่ไม่ดีสำหรับการตรวจจับสกรูที่น่าจะเกิดขึ้น การลบไดเรกทอรีย่อยไม่น่าจะเป็นไปได้ ข้อความไม่ได้ช่วยเพราะเพียงแค่ยืนยันสิ่งที่ผู้ใช้พูดโดยไม่เพิ่มข้อมูลที่เป็นประโยชน์ ณ จุดที่ผู้ใช้ไม่ต้องการตรวจสอบ "rm: ลบ 1 อาร์กิวเมนต์ซ้ำหรือไม่" "ใช่ลบไดเรกทอรีฉันเพิ่งบอกให้คุณทำอย่างนั้น! ... เดี๋ยวก่อนไดเรกทอรีไหนใช่ CRAP !!!"
Schwern

2

ฉันสอนทุกคนเกี่ยวกับ!$= อาร์กิวเมนต์สุดท้ายในเคล็ดลับคำสั่งสุดท้าย:

% ls job[XYZ].*
jobX.out1
jobX.out2
[rest of the matches]

% rm !$

นี้จะช่วยให้การตรวจสอบของการขยายตัวสัญลักษณ์แทนและจากนั้นใช้รูปแบบ glob *แน่นอนเดียวกันโดยไม่ต้องเป็นไปได้ของการแทรกช่องว่างก่อนที่

นอกจากนี้ฉันขอแนะนำให้ผู้คนไม่เคยตัดและวางรูปแบบสัญลักษณ์ตัวแทนกลมบนบรรทัดคำสั่งที่อาจทำลายล้าง เพราะในมือของฉันเองที่มีปัญหา :)

เทคโนโลยีในห้องปฏิบัติการของฉันเพิ่งทำผิดพลาดเมื่อสัปดาห์ที่แล้ว (ทำงาน 3 เดือน) - และใช่เรามีการสำรองข้อมูล (ใช้เวลา 1 วัน)


0

ดูเหมือนว่าทุกคนจะพูดว่า "ระวังตัวมากขึ้น", "อย่าทำให้นามแฝง / คำยืนยันยืนยันเพราะคุณจะไม่เคยใส่ใจกับมัน"

เจ๋งและทุกอย่าง ฉันหมายความว่าฉันไม่คิดว่าคุณควรสร้างนามแฝงให้rm(หรือrmrfเพราะคุณสามารถไขได้ง่ายและพิมพ์คำสั่งจริง)

แต่ทำไมคุณไม่สร้างนามแฝง / สคริปต์แล้วเรียกมันว่าพูดremoveและให้อาหารมันเพียงหนึ่งอาร์กิวเมนต์ (เช่น $ 1) อักขระตัวแทนควรเป็น $ 2 เนื่องจากช่องว่างที่ไม่ตั้งใจ (amiright?) และด้วยเหตุนี้สคริปต์ / wrapper / alias ของคุณจะไม่ได้รับการป้อนครั้งที่สอง ใช่คุณสามารถทำการลบได้ครั้งละหนึ่งชุดเท่านั้น (พร้อมด้วยไวด์การ์ด) แต่นั่นคือราคาที่คุณจ่าย

ถ้าฉันเขียนสิ่งที่ดีฉันอาจบอกให้ฉันทราบจำนวนไฟล์และไดเรกทอรีที่วางแผนในการลบและขนาดทั้งหมดของสิ่งที่ฉันลบแล้วขอการยืนยัน แต่นั่นอาจขัดขวางการไหลของคุณ อาจจะทำให้ตัวเลือกที่ธงในremove? (-ผม). คุณอาจต้องการตรวจสอบ $ 1 เพื่อดูว่าเป็นเพียงสัญลักษณ์เดียวและขอการยืนยันและรายการไดเรกทอรีที่คุณเข้ามา


นอกเหนือจากนั้นมีจำนวนของการrmเปลี่ยนออกมี หลายคนพยายามที่จะปฏิบัติตามถังขยะเดสก์ท็อป UI บางคนอาจจะคุ้มค่าที่จะดู


6
นามแฝง "ลบ" ของคุณจะไม่ลบไฟล์มากกว่าหนึ่งไฟล์ในแต่ละครั้ง คุณไม่สามารถใช้อักขระตัวแทนได้เนื่องจากเชลล์ขยายออกก่อนที่คำสั่งจะเห็น
Hymie

ถ้าอย่างนั้นก็ทำ eval แล้วดึงมันเข้าไปในสคริปต์?
3082

ดังนั้นคุณต้องการที่จะพิมพ์remove \*? หากสคริปต์ของคุณอนุญาตให้เปลือก glob-input ของฉันฉันไม่เห็นมันช่วยได้มาก
Peter Cordes

0

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.