การลบไฟล์ด้วยช่องว่างในชื่อของพวกเขา


10

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

คำสั่ง: ls | egrep '. ' | xargs rm

ที่นี่ถ้าฉันใช้ls | egrep '. 'คำสั่งเพียงอย่างเดียวมันให้ชื่อไฟล์ทั้งหมดพร้อมช่องว่างในชื่อไฟล์ แต่เมื่อฉันพยายามที่จะส่งออกไปยัง rm ช่องว่างทั้งหมด (นำหน้าหรือต่อท้าย) จะถูกลบ ดังนั้นคำสั่งของฉันไม่ได้รับการดำเนินการอย่างถูกต้อง

ตัวชี้ใด ๆ เกี่ยวกับวิธีลบไฟล์ที่มี atleast หนึ่งช่องว่างในชื่อของพวกเขา?

คำตอบ:


29

คุณสามารถใช้ globbing มาตรฐานกับrmคำสั่ง:

rm -- *\ *

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

หากคุณต้องการยืนยันแต่ละไฟล์ก่อนที่จะลบให้เพิ่ม-iตัวเลือก:

rm -i -- *\ *

4
คุณจะต้องการเรียกใช้สิ่งนี้ผ่านechoครั้งแรกอย่างแน่นอนเพื่อป้องกันการพิมพ์ผิด เพิ่มechoที่ด้านหน้าและจะพิมพ์ไฟล์ทั้งหมดที่จะลบออก
Riking

1
อันนุ, เหตุผลที่ทำให้สิ่งนี้มีแรงผลักดันมากที่สุดคือเพราะแม้ว่าfindมันจะทรงพลัง, บางครั้งคุณไม่จำเป็นต้องฆ่าไก่ด้วยปืนกล ผู้ดูแลระบบ UNIX จะโดยทั่วไปไม่รีสอร์ทเพื่อfindไป (ตัวอย่าง) "ลบไฟล์ทั้งหมดที่ขึ้นต้นด้วยตัวอักษร A" ... rm A*หนึ่งก็จะ เช่นเดียวกันกับการลบไฟล์ที่มีช่องว่าง rm สามารถทำงานได้ กล่าวอีกอย่างหนึ่งคืออย่าหลงกลเพราะพื้นที่มองไม่เห็นและได้รับการดูแลเป็นพิเศษจากเปลือกหอย หนีออกมาได้อย่างที่ Stephen Kitt ทำมาแล้วและคุณสามารถคิดได้เหมือนตัวละครอื่น ๆ
Mike S

14

ฉันจะหลีกเลี่ยงการแยกวิเคราะห์lsผลลัพธ์

ทำไมจะไม่ล่ะ :

find . -type f -name '* *' -delete

ไม่มีปัญหากับrm:-)

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


4
(1) คุณสามารถใช้-name '* *'แทน regex; และ (2) คุณสามารถใช้-print0 | xargs -0 rm -iเพื่อแก้ไขข้อกังวลของ @ StephenKitt
Kevin

1
xargsไม่จำเป็นต้อง เพียงใช้-exec rm -i '{}' +
R. GitHub หยุดช่วยน้ำแข็ง

1
@Mhmd มันมีข้อผิดพลาดมากกว่าเกมคอนโซล 8 บิต mywiki.wooledge.org/ParsingLs
Daenyth

1
find . -maxdepth 1 -name '* *' -deleteหากคุณต้องการที่จะหลีกเลี่ยงไดเรกทอรีย่อยใช้
Mikkel

1
@BenjaminW แก้ไขแล้ว ?
solsTiCe

6

ดูชื่อสมมติว่า "ไฟล์แปลก"

แนวทางหนึ่ง

rm strange\ file

โซลูชันที่สอง

rm "strange file"

โซลูชันที่สาม

ls -i "strange file"

คุณเห็นไอโหนดแล้ว

find . -inum "numberoofinode" -exec rm {} \;

ในกรณีที่ชื่อไฟล์แปลก ๆ อย่างเช่น

!-filename or --filename

ใช้

rm ./'!-filename'

4

จาก man xargs

xargs อ่านรายการจากอินพุตมาตรฐานคั่นด้วยช่องว่าง (ซึ่งสามารถป้องกันด้วยเครื่องหมายอัญประกาศคู่หรือเดี่ยวหรือแบ็กสแลช) หรือขึ้นบรรทัดใหม่และดำเนินการคำสั่ง (ค่าเริ่มต้นคือ / bin / echo) อย่างน้อยหนึ่งครั้ง โดยรายการที่อ่านจากอินพุตมาตรฐาน บรรทัดว่างในอินพุตมาตรฐานจะถูกละเว้น

เราสามารถ (ส่วนใหญ่) แก้ไขคำสั่งเริ่มต้นของคุณโดยเปลี่ยน xargs delimiter เป็น newline:

ls | egrep '. ' | xargs -d '\n' rm (อย่าทำอย่างนี้ ... อ่านต่อ)

แต่ถ้าชื่อไฟล์มีการขึ้นบรรทัดใหม่

touch "filename with blanks and newline"

เนื่องจากชื่อไฟล์ Unix สามารถมีช่องว่างและขึ้นบรรทัดใหม่พฤติกรรมเริ่มต้นนี้มักเป็นปัญหา ชื่อไฟล์ที่มีช่องว่างและ / หรือบรรทัดใหม่ถูกประมวลผลอย่างไม่ถูกต้องโดย xargs ในสถานการณ์เหล่านี้ควรใช้ตัวเลือก -0ซึ่งป้องกันปัญหาดังกล่าว

ls เป็นเครื่องมือสำหรับการบริโภคโดยตรงโดยมนุษย์แทนที่จะต้องใช้findคำสั่งที่สามารถแยกชื่อไฟล์ด้วยอักขระ null ( -print0) เราต้องบอก grep เพื่อใช้อักขระ null เพื่อแยกอินพุต ( -z) และเอาต์พุต ( -Z) สุดท้ายเราบอกให้ xargs ใช้ตัวอักษร null ( -0)

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm



-1

ในการทำเช่นนั้นคุณจะต้องมี-Zตัวเลือก grep และ-0ตัวเลือกของ xargs แต่ฉันจะไม่ทำแบบนั้น ( lsไม่ใช่เครื่องมือที่เหมาะสมสำหรับงานมีปัญหามากมายในการทำให้คอมพิวเตอร์อ่านผลลัพธ์)

ดูคำตอบอื่น ๆ สำหรับวิธีที่ดีกว่า


ด้วย

ls | …เทียบเท่ากับls -d *และecho * | …

ทั้งหมดมีปัญหา ดังนั้นอย่าใช้lsเช่นนี้ใช้วิธีแก้ปัญหาจากคำตอบอื่น


นอกจากนี้ls *เมื่อไพพ์เอาท์พุทชื่อไฟล์คั่นด้วยบรรทัดใหม่ echo(อย่างน้อยechoการใช้งานบางอย่าง) ขยายลำดับแบ็กสแลช grep -Zใช้สำหรับเขียนชื่อไฟล์คั่นด้วย NUL เมื่อใช้-lจะไม่ช่วยอะไร หากคุณหมายถึง-zนั่นจะไม่ช่วยได้เนื่องจากlsการติดตั้งใช้งานส่วนใหญ่ไม่มีตัวเลือกในการกำหนดชื่อไฟล์ที่คั่นด้วย NUL เราสามารถทำอะไรบางอย่างprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -fได้
Stéphane Chazelas

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