สคริปต์ Bash นี้มาแทนที่แอป 3 ตัวที่ฉันใช้ทุกวัน
ระบบของฉันไม่เคยพัง แต่กลับเสื่อมสภาพเรื่อย ๆ แคชกองพะเนิน ไฟล์ซ้ำเพิ่มขึ้น และชื่อไฟล์ค่อย ๆ กลายเป็นเรื่องไร้สาระ การรักษาความเรียบร้อยจึงกลายเป็นงานของตัวเอง
เป็นเวลานาน ผมพึ่งพาเครื่องมือเล็กๆ ไม่กี่ตัวในการควบคุมสิ่งนี้ พวกมันทั้งหมดทำงานได้ดี แต่มีข้อบกพร่องเหมือนกันทั้งหมด คือเป็นแบบตอบสนองทีหลัง ทำด้วยมือ และต้องให้ผมจำที่จะเรียกใช้งาน ในที่สุดผมก็เข้าใจว่าพวกมันทั้งหมดแค่บังคับใช้กฎง่ายๆ ที่ผมเข้าใจอยู่แล้ว ดังนั้นผมจึงเลิกเปิดแอปต่างๆ และเขียนสคริปต์ Bash เพียงตัวเดียวเพื่อใช้กฎเหล่านั้นโดยอัตโนมัติ
ทำความสะอาดระบบ
ฉันเคยพึ่งพา BleachBit ในการทำความสะอาดระบบของฉัน: แคชของเบราว์เซอร์ ไฟล์ชั่วคราว บันทึกเก่าๆ และขยะทั่วไปที่สะสมขึ้นตามกาลเวลา
BleachBit ทำงานของมันได้ดี แต่กระบวนการทำงานรู้สึกว่าผิดปกติเล็กน้อย ผมต้องจำไว้ว่าเปิดมัน, สแกน, ตรวจสอบรายการ, และคลิกผ่าน GUI สำหรับสิ่งที่โดยพื้นฐานสามารถคาดเดาได้ แคชของเบราว์เซอร์ของผมอยู่ในไดเรกทอรีเดียวกันทุกครั้ง ไฟล์ชั่วคราวมักอยู่ใน /tmp และบันทึกเก่ามักเติบโตอยู่ใน /var/log สิ่งเหล่านี้ไม่มีอะไรเป็นไดนามิกหรือแปลกใจ
ในทางปฏิบัติแล้ว ผมไม่ได้กำลัง ‘ค้นพบ’ อะไรเลย ผมเพียงแค่ใช้กฎเดิมซ้ำๆ: ลบไดเรกทอรีแคชที่ทราบอยู่แล้ว ล้างไฟล์ชั่วคราว ล้างถังขยะ และลบไฟล์ล็อกที่เก่ากว่าวันที่ที่กำหนด นั่นคือประเภทงานที่สคริปต์เชลล์ทำได้ดี
ฟังก์ชันทำความสะอาดของฉันเป็นเพียงรายการของการกระทำที่ปลอดภัยและชัดเจน มีเพียงชุดเล็ก ๆ ของไดเรกทอรีที่ฉันต้องการทำความสะอาดจริง ๆ และมีเกณฑ์เวลาสำหรับสิ่งใดก็ตามที่ควรหมดอายุ
# Clear common cache directories
rm -rf ~/.cache/*
rm -rf ~/.mozilla/firefox/*/cache2/*
rm -rf ~/.config/google-chrome/Default/Cache/*
# Clear temporary files
rm -rf /tmp/*
# Remove old logs (older than 7 days)
find /var/log -type f -mtime +7 -exec rm -f {} \;
นี่ดูรุนแรง แต่จริง ๆ แล้วมันน่าเบื่อโดยตั้งใจ ทุกเส้นทางเป็นสิ่งที่ผมทำความสะอาดด้วยมือมาก่อน ไม่มีการวนซ้ำในไดเรกทอรีบ้านของผม ไม่มีการลบตามรูปแบบ และไม่มีความพยายามที่จะฉลาด เมื่อผมไม่แน่ใจกับกฎ ผมจะเริ่มด้วยการทดลองแบบ dry run โดยใช้ find ... -print แทน -exec rm
ผลลัพธ์ก็คือว่าฉันไม่จำเป็นต้อง ‘ทำความสะอาดระบบ’ อีกต่อไป มันเกิดขึ้นเอง สิ่งที่เคยเป็นการใช้งาน BleachBit เป็นระยะ ๆ ตอนนี้กลายเป็นฟังก์ชันเดียวที่ฉันสามารถเรียกใช้งานได้ตามต้องการหรือกำหนดเวลาให้ cron ทำงานและลืมมันไปเลย
การค้นหาข้อมูลซ้ำ
สำหรับการหาคู่ไฟล์ซ้ำ ผมใช้ Czkawka ซึ่งเป็นเครื่องมือที่มีประสิทธิภาพ สามารถสแกนโฟลเดอร์ทั้งหมด เปรียบเทียบไฟล์ตามขนาดหรือแฮช และแสดงให้คุณเห็นว่าคุณกำลังเสียพื้นที่ดิสก์ตรงไหนบ้าง
ปัญหาไม่ใช่เรื่องฟังก์ชัน แต่เป็นความยุ่งยาก การใช้ Czkawka หมายถึงการเปิดแอปอีกตัวหนึ่ง เลือกโหมดการสแกน รอผลลัพธ์ แล้วจากนั้นก็มาตรวจสอบรายการด้วยตนเองทุกครั้ง ซึ่งผมมักจะใช้มันก็ต่อเมื่อพื้นที่ดิสก์มีปัญหา แม้ว่าจะมีไฟล์ซ้ำสะสมอยู่เบื้องหลังตลอดเวลา
เบื้องหลัง การตรวจจับไฟล์ซ้ำไม่ใช่เรื่องวิเศษ มันเป็นกระบวนการง่ายๆ: จัดกลุ่มไฟล์ตามขนาด คำนวณแฮชสำหรับไฟล์ที่เป็นไปได้ และถือว่าแฮชที่เหมือนกันคือไฟล์ซ้ำ เมื่อคุณเข้าใจตรงนี้ ปัญหาก็จะไม่ใช่ "ฉันควรใช้แอปไหน?" แต่จะกลายเป็น "ทำไมฉันถึงยังไม่ทำให้มันเป็นอัตโนมัติ?"
สคริปต์ของฉันเป็นไปตามตรรกะนั้นอย่างแม่นยำ มันเริ่มต้นด้วยการจัดกลุ่มไฟล์ตามขนาดเพื่อหลีกเลี่ยงงานที่ไม่จำเป็น จากนั้นจึงคำนวณแฮชสำหรับแต่ละกลุ่ม และสุดท้ายรายงานไฟล์ที่มีแฮชเหมือนกัน โดยค่าเริ่มต้น มันจะทำงานในโหมดจำลองและแสดงผลลัพธ์เท่านั้น
# Find files larger than 1MB and group by size
find ~/Documents -type f -size +1M -exec ls -l {} \; \
| awk '{print $5, $9}' \
| sort -n > sizes.txt
# Compute hashes for potential duplicates
awk '{print $2}' sizes.txt | xargs sha256sum > hashes.txt
# Show duplicate hashes
sort hashes.txt | uniq -d -w64
เช่นเดียวกับการทำความสะอาด สคริปต์จะไม่ลบอะไรโดยค่าเริ่มต้น มันจะแค่รายงานไฟล์ซ้ำเท่านั้น ถ้าฉันต้องการลบไฟล์เหล่านั้น ฉันจะลบเองอย่างชัดเจนและมักเก็บสำเนาใหม่ที่สุด การทำงานอัตโนมัติมีประโยชน์ แต่การลบแบบไม่เลือกปฏิบัติจะทำให้ข้อมูลหาย
นี่แทนที่ความต้องการใช้ Czkawka ของฉันอย่างสมบูรณ์ ฉันไม่ต้องสแกนหาของซ้ำเป็นงานพิเศษอีกต่อไป แค่รันคำสั่งเดียว ก็ได้รายชื่อออกมาแล้วจัดการทันที
การเปลี่ยนชื่อเป็นกลุ่ม
สำหรับการเปลี่ยนชื่อเป็นจำนวนมาก ผมพึ่งพา GPRename มันเป็นเครื่องมือที่คุณอาจไม่ค่อยคิดถึง แต่สุดท้ายกลับใช้บ่อย โดยเฉพาะเมื่อจัดการกับรูปภาพ ดาวน์โหลด หรือไฟล์ที่มาจากคนอื่น
ปัญหาไม่ได้อยู่ที่ GPRename แย่ แต่ผมเองที่มักจะทำสิ่งเดิม ๆ อยู่เสมอ: เปลี่ยนชื่อไฟล์เป็นตัวพิมพ์เล็ก, แทนที่ช่องว่างด้วยขีดกลาง, ลบตัวอักษรแปลก ๆ หรือเพิ่มวันเดือนปีไว้ข้างหน้า ทุกครั้งที่ใช้งานก็เป็นแค่เวอร์ชั่นเล็กน้อยของครั้งก่อน แต่ก็ยังต้องเปิด GUI แล้วคลิกตัวเลือกต่าง ๆ อยู่ดี
ในช่วงหนึ่ง ฉันก็เข้าใจว่าฉันไม่ได้ตัดสินใจอะไรจริง ๆ เลย ฉันมีวิธีตั้งชื่อส่วนตัว แล้วฉันก็แค่บังคับใช้มันด้วยตัวเองซ้ำไปซ้ำมา
เมื่อคุณมองการเปลี่ยนชื่อไฟล์เป็นชุดของกฎ Bash จะกลายเป็นตัวเลือกที่ชัดเจน คุณมีวงจรการทำงาน (loops), regular expressions และการจัดการสตริงอยู่แล้ว และต่างจาก GUI กฎต่าง ๆ จะอยู่ในรูปแบบข้อความธรรมดา
for f in *; do
new=$(echo "$f" \
| tr '[:upper:]' '[:lower:]' \
| tr ' ' '-' \
| sed 's/[^a-z0-9._-]//g')
echo "$f -> $new"
mv "$f" "$new"
done
เช่นเดียวกับทุกอย่างอื่น ๆ โดยปกติผมจะเริ่มด้วยการใช้ echo แทน mv เพื่อดูผลลัพธ์ก่อน การเปลี่ยนชื่อไฟล์ทำได้เร็ว แต่ก็ไม่สามารถย้อนกลับได้ถ้าคุณไม่ระวัง ซึ่งสิ่งนี้ทำให้ GPRename ถูกตัดออกจากกระบวนการทำงานของผมโดยสิ้นเชิง แทนที่จะเปิดโปรแกรมเปลี่ยนชื่อไฟล์ ผมก็ใช้กฎการตั้งชื่อของผมโดยตรงเลย
ผลตอบแทน
ผลลัพธ์เชิงปฏิบัติคือฉันไม่เปิดแอปทั้งสามนี้แยกกันเพื่อทำกิจกรรมสามอย่างอีกต่อไป ฉันแค่รันสคริปต์เดียว หรือปล่อยให้มันทำงานอยู่เบื้องหลัง
งานบำรุงรักษาที่เคยทำมาก่อน ตอนนี้กลายเป็นเพียงผลข้างเคียงจากการใช้ระบบของฉัน พื้นที่ดิสก์ยังคงคาดเดาได้ โฟลเดอร์บ้านของฉันไม่เสื่อมสภาพโดยไม่รู้ตัว ชื่อไฟล์ยังคงเป็นไปตามมาตรฐานเดิมโดยที่ฉันไม่ต้องคิดมาก
ที่สำคัญไปกว่านั้น ความพยายามทางจิตใจหายไป ไม่มีแผงควบคุมให้ตรวจสอบ ไม่มีปุ่มให้คลิก และไม่มีการตัดสินใจให้ทำ กฎถูกเขียนเพียงครั้งเดียวเป็นข้อความธรรมดา และถูกนำไปใช้ต่อเนื่องอย่างสม่ำเสมอ
ชัยชนะที่แท้จริงในที่นี้ไม่ใช่การแทนที่แอปสามตัวด้วย Bash แต่เป็นการตระหนักว่ากระบวนการทำงานส่วนใหญ่ของฉันเป็นเพียงชุดของนิสัยที่รอการทำให้เป็นอัตโนมัติ นี่เป็นเพียงตัวอย่างหนึ่งของการเขียนสคริปต์ Bash และวิธีที่มันสามารถเปลี่ยนประสบการณ์การใช้ Linux ของคุณ คุณสามารถดูสคริปต์เต็มพร้อม README ได้ที่ GitHub ของฉัน


