ลบโฟลเดอร์ย่อยที่ว่างเปล่าเก็บโฟลเดอร์หลัก


15

เมื่อฉันใช้

find /home/user/parentdir -type d -empty -delete

มันจะดูซ้ำ ๆ สำหรับโฟลเดอร์ย่อยที่ว่างอยู่ข้างใน/home/user/parentdirและลบออก แต่ถ้า/home/user/parentdirมันว่างเปล่ามันก็ลบparentdirโฟลเดอร์ด้วยซึ่งไม่เป็นที่พึงปรารถนาสำหรับฉัน

ฉันต้องการที่จะเก็บเรื่องนี้ไว้parentdirเพื่อrsyncบางไฟล์เพื่อการสำรองข้อมูลหรือระบบคลาวด์ หลังจากการประมวลผลฉันจำเป็นต้องลบโฟลเดอร์ที่ว่างเปล่า แต่ดูเหมือนจะไม่เกิดผลเพื่อสร้างparentdirทุกครั้ง

ข้อเสนอแนะใด ๆ ที่จะเก็บparentdir? ฉันคิดเกี่ยวกับการสร้าง.nocopyไฟล์ที่อยู่ภายในและแยกออกจากrsyncแต่ดูเหมือนว่า overkill มีวิธีที่สง่างามกว่านี้ไหม?


หากคุณเพิ่มเครื่องหมายสแลช / ไปยังจุดสิ้นสุดของ / parentdir (เช่น / parentdir /) สิ่งนั้นสร้างความแตกต่างหรือไม่?
เกรแฮม


@ Graham / parentdir / ลบ parentdir ด้วยดังนั้นไม่สร้างความแตกต่าง
ทีเอ็นที

อ่าฉันเห็นว่าฉันพลาด * ในตอนท้ายที่ @Amourk กล่าวถึงในคำตอบของเขา
เกรแฮม

คำตอบ:


25

find /home/user/parentdir -mindepth 1 -type d -empty -deleteเพียงแค่ทำ

ดู:

$ mkdir -p test1/test2
$ find test1 -type d
test1
test1/test2
$ find test1 -mindepth 1  -type d
test1/test2

find /home/user/parentdir/* ในคำตอบของ AmourKเป็นที่พึงปรารถนาเมื่อมีจำนวนมากของไฟล์และมันจะ overcomplicated


15

โดยการเพิ่ม/*ที่ส่วนท้ายของparentdirคุณกำลังดำเนินการกับผู้ปกครองทั้งหมดของผู้ปกครองมากกว่าที่จะดำเนินการparentdirเอง ดังนั้นในทำนองเดียวกัน/home/user/จะไม่ถูกลบในคำสั่งเก่าparentdirจะไม่ถูกลบในคำสั่งด้านล่าง *เรียกว่าตัวดำเนินการแบบกลมและตรงกับสายอักขระใด ๆ

find /home/user/parentdir/* -type d -empty -delete


7
สิ่งหนึ่งที่จะตระหนักถึงด้วยวิธีนี้คือถ้ามีขนาดใหญ่จำนวนของไฟล์ใน/home/user/parentdir/การขยาย glob อาจเกินARG_MAXส่งผลให้รายการอาร์กิวเมนต์ยาวเกินไปข้อผิดพลาด คุณสามารถลดโอกาสที่จะเกิดขึ้นได้โดยเปลี่ยน glob ไปเป็น*/เพื่อให้ตรงกับไดเรกทอรีเท่านั้น
ขับขี่เหล็ก

12
นอกจากนี้ระวังว่าสิ่งนี้จะไม่พบเด็ก ๆ ที่เริ่มต้นด้วยจุด และสักวันหนึ่งคุณจะตระหนักถึงสิ่งนี้และหากคุณค้นหา ". *" คุณจะอยู่ในโลกแห่งความเจ็บปวดอันใหญ่หลวง (เพราะ ". *" จับคู่ ".. ") ถามฉันว่าฉันรู้
Glenn Willen

1
@ Glenn ทำไมฉันคิดว่าเราควรจะนั่งที่บาร์พร้อมเครื่องดื่มต่อหน้าเราก่อนที่ฉันจะขอให้คุณเล่าเรื่องนี้
Monty Harder

@MontyHarder โชคดีที่มันไม่ได้แย่อย่างที่ควรจะเป็น มันเป็นระบบ Unix แรกของฉันซึ่งเป็นเครื่อง Solaris ที่โรงเรียนมัธยมของฉันเป็นเจ้าของ ขอบคุณพระเจ้าที่ฉันไม่ได้เรียกใช้ 'rm' แต่แทนที่จะ 'chown' ฉันใช้รูทเพื่อพยายามแก้ไขความเป็นเจ้าของทุกสิ่งในโฮมไดเร็กตอรี่ของฉัน แต่ฉันให้สิทธิ์การเป็นเจ้าของบ้านทุก ๆ ไดเรกทอรี (และเนื้อหาทั้งหมด) จากนั้นจึงต้องนำพวกเขากลับมาทั้งหมด
Glenn Willen

ฉันมีเพื่อนร่วมงานฝึกอบรมพนักงานใหม่เกี่ยวกับวิธีการติดตั้งซอฟต์แวร์ มันเกี่ยวข้องกับ/tmpการสร้างไดเรกทอรีย่อยแกะ tarball gzipped ที่นั่นเรียกใช้ตัวติดตั้งและล้างข้อมูล มือใหม่คิดว่าrm -rf /tmp/foo-installเป็นวิธีที่ถูกต้องในการทำเช่นนั้นและเมื่อมือที่มีประสบการณ์พูดว่า "Noooooo" ในการแสดงผลที่ดีที่สุดของ Darth-Vader-at-the-end-of-the-Episode-III / และ Enter key ต่างกัน เราต้องบูตจากดิสก์กู้คืนซอฟต์แวร์สำรองและโหลดเซิร์ฟเวอร์ทั้งหมดจากเทป
Monty Harder

0

หากคุณติดตั้ง php-cli

printf %s $(pwd) | php -r 'function f(string $dir){var_dump($dir);$dir.=DIRECTORY_SEPARATOR;foreach(glob("$dir*",GLOB_ONLYDIR) as $d){f($d);}global $original;if(substr($dir,0,-strlen(DIRECTORY_SEPARATOR))!==$original && empty(glob("$dir*"))){rmdir($dir);}}f(($original=stream_get_contents(STDIN)));'

คุณต้องการforeach (RecursiveIteratorIterator(RecursiveDirectoryIterator($dir)) as $p) if (empty($skipped)) $skipped = TRUE; elseif ($p->isDir()) @rmdir($p->getPathname());หรืออะไรที่ใกล้เคียง $skippedดูแลข้ามคนแรก@rmdirพยายามลบ dir และเงียบ (นั่นคือ @) ล้มเหลวหากไม่ว่างเปล่า
chx

0

เมื่อคุณต้องการเพียงระดับหนึ่ง (ออกจากโฟลเดอร์หลัก แต่การลบโฟลเดอร์ย่อยที่ว่างเปล่า) rmdirเคล็ดลับง่ายคือการใช้งาน

rmdir parent/*

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

สิ่งนี้ไม่ทำงานซ้ำ ๆ แต่เมื่อรู้โครงสร้างโฟลเดอร์ของคุณมันอาจเป็นวิธีที่เร็วที่สุดที่จะทำสิ่งที่ต้องการ

rmdir parent/*/*/* # deletes parent/a/b/c when empty
rmdir parent/*/* # deletes parent/a/b when it is now empty
rmdir parent/* # deletes parent/a when it is now empty

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

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