ลบไฟล์ในช่วงขนาดที่แน่นอน


12

ฉันต้องการลบไฟล์ที่มีขนาดอยู่ระหว่างค่าที่แน่นอน ตัวอย่างเช่นฉันมีรายการไฟล์ต่อไปนี้:

-rw-r--r-- 1 smsc sys  558 Apr 30 13:07 stats.sfe.1.20120430130513.xml.Z
-rw-r--r-- 1 smsc sys  388 Apr 30 15:32 stats.sfe.1.20120430153013.xml.Z
-rw-r--r-- 1 smsc sys  386 Apr 30 15:36 stats.sfe.1.20120430153513.xml.Z
-rw-r--r-- 1 smsc sys  389 Apr 30 15:42 stats.sfe.1.20120430154013.xml.Z
-rw-r--r-- 1 smsc sys  390 Apr 30 16:02 stats.sfe.1.20120430160013.xml.Z
-rw-r--r-- 1 smsc sys  385 Apr 30 16:12 stats.sfe.1.20120430161013.xml.Z

จากรายการดังกล่าวข้างต้นผมต้องการที่จะลบเฉพาะไฟล์ที่มีขนาดแตกต่างกันระหว่าง386Bและ390b ฉันรู้ว่าฉันสามารถใช้คำสั่งต่อไปนี้เพื่อลบไฟล์ที่มีขนาดเกินขนาดที่แน่นอน<size>:

find . -size +<size>-delete

แต่ฉันจะเพิ่มขอบเขตเพิ่มเติมสำหรับไฟล์ที่มีขนาดน้อยกว่าค่าที่กำหนดได้อย่างไร


4
findเงื่อนไขเป็นไปตามหลักเหตุผลและตามค่าเริ่มต้นดังนั้นเพียงจับที่-sizeตัวเลือกอื่นสำหรับขอบเขตอื่น ๆ
jw013

@ jw013 เยี่ยมมาก! ที่เหมาะกับฉัน ขอบคุณ! กรุณาโพสต์มันเป็นคำตอบของคุณและฉันจะยอมรับมัน
Eugene S

คำตอบ:


7

ช่วงคือขอบเขตบนและขอบเขตล่าง จากfindสเป็ค :

การแสดงออก [-a] การแสดงออก

การรวมกันของพรรค; ตัวดำเนินการ AND ถูกบอกเป็นนัยโดยการตีข่าวของสองพรรคหรือทำอย่างชัดเจนโดยตัวเลือก -a นิพจน์ที่สองจะไม่ถูกประเมินถ้านิพจน์แรกเป็นเท็จ

ดังนั้นสิ่งที่คุณต้องทำคือระบุขนาดทั้งสองก่อน-deleteดำเนินการ


8

-aในอย่างชัดเจนANDผู้ประกอบการที่ช่วยให้คุณพร้อมใจทั้งสองพรรค -sizeในกรณีนี้การสร้างช่วงใช้

find . -size +386b -a -size -390b -exec rm -f {} \;

หมายเหตุขนาดอาร์กิวเมนต์ที่เป็นตัวเลขที่สามารถเลือกที่จะใช้ได้กับและ+ -จากman 1 find:

   Numeric arguments can be specified as

   +n     for greater than n,
   -n     for less than n,
    n      for exactly n.

ขอบคุณสำหรับคำตอบ. อย่างไรก็ตามตามที่ @ jw013 พูดถึงในความคิดเห็นของเขาfindเงื่อนไขจะมีเหตุผลและจะตามค่าเริ่มต้น ดังนั้นฉันเพิ่งเพิ่มอีกหนึ่งsizeเงื่อนไขและใช้งานได้ดี! คำสั่งสุดท้ายดูเหมือนว่า:find . -maxdepth 1 -size +358c -size -395c -delete
Eugene S

7

เมื่อใดก็ตามที่findคาดว่าจะมีตัวเลขคุณสามารถใส่+เครื่องหมายไว้ข้างหน้าเพื่อให้มีความหมายมากกว่าจำนวนนี้หรือ-เครื่องหมายที่มีความหมายน้อยกว่าจำนวนนี้ นี่คือความไม่เท่าเทียมที่เข้มงวด: +3และ-7หมายถึง 4, 5 หรือ 6

ด้วย-sizeหลักคุณจะต้องเพิ่มคำต่อท้ายcเพื่อระบุว่าจำนวนนั้นเป็นจำนวนไบต์ คุณสามารถต่อรองหลายอันเข้าด้วยกัน (ในบางรุ่นคุณสามารถใส่-aหรือ-andระหว่าง) ดังนั้น:

find . -size +385c -size -391c -delete

ใน zsh, คุณสามารถใช้รอบคัดเลือกL glob หน่วยเริ่มต้นคือไบต์ เช่นfindตัวละคร+และ-แสดงความไม่เท่าเทียมที่เข้มงวด

rm *(L+385-391)

(คำสั่งด้านบนไม่ได้เรียกเก็บเงินคืนในไดเรกทอรีย่อยหากคุณต้องการให้เพิ่ม**/ก่อนรูปแบบ)


ฉันไม่เข้าใจ +3 และ -7 ซึ่งเท่ากับ 4, 5 หรือ 6 คุณอธิบายได้ไหม
Hashim

1

วิธีหนึ่งในการใช้perl:

perl -e '
    for ( @ARGV ) { 
        if ( -s >= 386 && -s _ <= 390 ) { 
            unlink $_ or printf qq[%s\n], qq[Could not delete $_: $!] 
        } 
    }
' *

ขอบคุณสำหรับคำตอบ! ควรป้อนรหัสส่วนนี้เป็นบรรทัดเดียวหรือไม่
Eugene S

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