วิธีการยกเว้นบางไฟล์จากกลไกการขยายชื่อไฟล์ในทุบตี?


14

ฉันมีไดเรกทอรีระบบไฟล์ Ubuntu ในไดเรกทอรีรากและฉันตั้งใจคัดลอกหลายร้อยไฟล์ลงในไดเรกทอรีราก

ฉันพยายามลบไฟล์ที่คัดลอกโดยไม่รวมระบบไฟล์เช่น

rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./.

บุมันไม่ทำงาน วิธีที่เหมาะสมในการยกเว้นไดเรกทอรีบางรายการในขณะที่ลบทั้งรายการคืออะไร

แก้ไข: อย่าลองคำสั่งใด ๆ ที่นี่โดยไม่รู้ว่าจะทำอย่างไร!


1
คุณใช้เปลือกอะไร ชื่อไฟล์ globbing เป็นเปลือกขึ้นอยู่กับเมื่อมันมาทำสิ่งแฟนซี
Kusalananda

2
ไม่ได้คำตอบ mcแต่ผมจะใช้ตัวอย่างเช่น เลือกทุกอย่างด้วย*แล้วยกเลิกการเลือกไฟล์เฉพาะด้วย-หรือInsertปุ่ม
pbm

1
คุณช่วยอธิบายว่า 'mc' คืออะไร?
MikeP

@Kusalananda มัน/bin/bash
kenn

3
@ MikeP: mcเป็นผู้บัญชาการ Midnight ซึ่งเป็นการเลียนแบบที่มีประโยชน์มากของ Norton Commander มันทำงานในสถานี (ทั้งผู้บัญชาการ Midnight และ Norton Commander เป็นตัวอย่างของสิ่งที่เรียกว่าตัวจัดการไฟล์ดั้งเดิม )
AlexP

คำตอบ:


21

เนื่องจากคุณใช้bash:

shopt -s extglob
echo rm -rf ./!(bin|sbin|usr|...)

ฉันขอแนะนำให้เพิ่มechoที่จุดเริ่มต้นของบรรทัดคำสั่งเมื่อคุณเรียกใช้บางสิ่งที่อาจทำให้ระบบทั้งหมดระเบิด ลบออกถ้าคุณพอใจกับผลลัพธ์

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

shopt -s dotglob

ฉันใช้มันเพื่อทำความสะอาดระบบไฟล์เรียบร้อยแล้ว ตอนแรกฉันทดสอบในไดเรกทอรี ฉันยังพยายามrm -rf ./!(bin,sbin,..)คั่นด้วยเครื่องหมายจุลภาค แต่จะลบไดเรกทอรีทั้งหมด
เคนน์

!(...)ไวยากรณ์นั้นคืออะไร จากตัวอย่างที่ฉันคิดอย่างสังหรณ์ใจว่าls ./!(*/)จะแสดงรายการเฉพาะไฟล์ แต่ไม่ได้ผล
giusti

@giusti ไวยากรณ์นี้ขยายการจับคู่รูปแบบในกลไกการขยายชื่อไฟล์ - คุณจะพบคำอธิบายในคู่มือทุบตีภายใต้บทขยายเส้นทางชื่อ ไม่สามารถใช้เพื่อยกเว้นประเภทของไฟล์, เฉพาะชื่อ, เช่นเดียวกับดาว*หรือ globs อื่น ๆ
jimmij

12

คำสั่งนี้จะแสดงไดเรกทอรีที่ไม่ใช่ทั้งหมดใน/:

find / -maxdepth 1 -type f

เมื่อคุณได้อย่างแน่ใจว่าไม่มีไฟล์จะมีที่คุณต้องการเพื่อให้คุณสามารถใช้:

find / -maxdepth 1 -type f -delete

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

mkdir /root/preserve
find / -maxdepth 1 -type f -exec mv -- "{}" /root/preserve/\;

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

ถ้าสิ่งนี้ไม่เป็นไปได้

#!/bin/bash
declare -a excludes
for item in root sys 'lost+found' mnt home proc etc opt boot lib lib64 libx32 sbin media srv dev var usr bin tmp run; do
    excludes+=("$item")
done
if ! [[ -d /root/preserve ]]; then
    mkdir -p /root/preserve
fi
IFS="\n"
for item in find / -type d -maxdepth 1; do
    really=true
    for exclude in ${excludes[@]}; do
        if [[ "$exclude" == "${item#/}" ]]; then
            really=false
        fi
    done
    if [[ "true" == "$really" ]]; then
        mv -- "$item" /root/preserve/
    fi
done

เมื่อคุณผ่านการทดสอบกรีดร้อง (เช่นระบบของคุณยังคงทำงานอยู่และคุณไม่ได้กรีดร้องด้วยความเจ็บปวด) คุณสามารถลบเนื้อหาของ /root/preserve/คุณสามารถลบเนื้อหาของ

หมายเหตุสำคัญ: rm -fr [ANYTHING GOES HERE] /สิ่งที่คุณทำไม่ได้คิดเกี่ยวกับการทำงานของการเปลี่ยนแปลงใด


โซลูชันของคุณจะลบไฟล์ แต่มีโฟลเดอร์อยู่ด้วย
เคนน์

1
rmหนึ่งที่หลายครั้งเกินไปผมเคยได้ยินเสียงร้องของความผิดหวังจากไม่ดีมีจุดมุ่งหมาย เช่นเดียวกับสคริปต์ที่มีrm -fr $somepath/กับsomepathuninitialized ในนั้น ฉันอาจจะไปไกลกว่านี้ในการแสดงว่าหลุมฝังศพนี้เป็นอย่างไร แต่เลือกที่จะยังคงเป็นมิตรกับครอบครัวในคำเตือนของฉัน
DopeGhoti

3

สิ่งนี้ควรทำให้งานเสร็จ (แต่ไม่ใช่ในลักษณะเดียวกับ OP ถาม):

ls -1 >1.txt
pico 1.txt 

ลบไฟล์ / ไดเรกทอรีทั้งหมดที่คุณต้องการเก็บไว้

xargs rm < 1.txt

หากไฟล์ของคุณมีรูปแบบชื่อวันที่หรืออย่างอื่นเหมือนกันแสดงว่ามีวิธีอื่น

ฉันจะดูที่ inodes - และดูว่าพวกมันเรียงตามลำดับผ่านls -i | sortหรือไม่ถ้าเป็นแล้วไฟล์ใหม่จะมี inodes ที่ใหญ่กว่า จากนั้นใช้กระบวนการชนิดเดียวกันข้างต้น ...

ls -iF1 | sort |cut -c10- | grep -vE "\/|\@" >i.txt   #This part removes entries that are not regular files, such as directories and links.  
pico i.txt
xargs rm < i.txt

ในคำสั่ง cut ด้านบนตรวจสอบรายการ inodes ของคุณก่อนเพื่อให้แน่ใจว่าเป็นปริมาณที่เหมาะสม

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