ฉันจะบอกได้อย่างไรว่าไฟล์ใดไฟล์หนึ่งอยู่ในไดเรกทอรี?


3

ฉันต้องการค้นหา (และลบ) ไฟล์ทั้งหมดจากไดเรกทอรีที่อยู่ในไดเรกทอรีนานกว่า X วัน ฉันรู้ว่าฉันสามารถค้นหาไฟล์ที่ไม่ได้รับการแก้ไขในหนึ่งชั่วโมงด้วยfind /directory/* -mmin 3600แต่เมื่อฉันคัดลอกไฟล์เก่าบน Windows ไปยังไดเรกทอรีของฉันบนเซิร์ฟเวอร์ Debian มันจะเก็บอายุไว้และฉันไม่สามารถบอกได้ว่านานแค่ไหนแล้ว .


ฉันคิดว่าสิ่งนี้สามารถทำได้ง่ายขึ้นด้วยการจัดทำดัชนีไฟล์อ่านการเปลี่ยนแปลงที่เก่าที่สุดของไฟล์หรือวันที่สร้าง ขอโทษฉันไม่ได้ให้สคริปต์ แต่ฉันเป็นสนิมในแผนกการเข้ารหัส
Lorenzo Von Matterhorn

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

1
หากสามารถใช้งาน( launchpad.net/timevault/+download ) กับสคริปต์ cli ได้ฉันคิดว่าทำได้ง่ายขึ้น ยังคงฉันถือว่าหนึ่งในผู้เชี่ยวชาญของเราจะออกมาพร้อมกับคำตอบที่มีประสิทธิภาพมากขึ้น
Lorenzo Von Matterhorn

@ LorenzoVonMatterhorn มีความคิด เก็บสแน็ปช็อตที่ค่อนข้างบ่อยของไดเรกทอรีและตรวจสอบแต่ละไฟล์กับสแน็ปช็อต ฉันจะต่อต้านการใช้ชื่อ (ถ้าฉันอยู่ในตำแหน่งของ Jakub) แต่นั่นอาจเป็นที่ยอมรับได้ที่นี่หรืออาจจะเปรียบเทียบเนื้อหาไฟล์หรือ inode หรืออะไรก็ได้ ที่จริงแล้วอาจไม่จำเป็นต้องมีสแนปชอตเต็มรูปแบบ - เพียงแค่สามารถเดินไดเรกทอรีเป็นระยะและแฮชไฟล์แต่ละไฟล์จากนั้นเขียนแฮชทั้งหมดไปยังไฟล์ที่อยู่นอกไดเรกทอรีและเก็บไว้รอบ ๆ เพื่อตรวจสอบในภายหลัง
แบล็กไลท์ส่องแสง

และถ้าคุณใช้บางอย่างเช่นinotifyคุณสามารถบันทึกได้อย่างแท้จริงเมื่อมีการเพิ่มไฟล์! อืมฉันคิดว่าฉันทำอะไรบางอย่างที่นี่
แบล็กไลท์ส่องแสง

คำตอบ:


0

มีเชลล์สคริปต์

#!/bin/sh

inotifywait --monitor --format="%e %f" --event=create,moved_from,moved_to,delete $directory |
while read event file
do
    case "$event" in
        # asterisks needed because directory events end in ",ISDIR"
        (CREATE*)
            echo "$(date +%s) $file" >>"$index"
            ;;
        (MOVED_TO*)
            # moved_to includes overwrites, so we have to grep out the file, to make sure it wasn't already there
            # use `sponge` to enable safe reading and writing of the index in the same pipeline
            grep -Fv " $file" "$index" | sponge "$index"
            echo "$(date +%s) $file" >>"$index"
            ;;
        (MOVED_FROM*|DELETE*)
            grep -Fv " $file" "$index" | sponge "$index"
            ;;
    esac
done

การเข้าถึงและการแก้ไขไฟล์จะถูกละเว้นและห้ามเปลี่ยนดัชนี อย่างไรก็ตามหากคุณเปลี่ยนชื่อไฟล์การประทับเวลาจะถูกอัปเดต

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

inotifywaitตามที่เรียกใช้ในสคริปต์ฟังเหตุการณ์ไฟล์และส่งออกประเภทเหตุการณ์ช่องว่างชื่อไฟล์หรือไดเรกทอรีที่ทำให้เกิดเหตุการณ์และขึ้นบรรทัดใหม่ คุณอาจแทนที่ด้วยโปรแกรมที่เทียบเท่า

spongeเพียงอ่านอินพุตทั้งหมดจากstdinลงในบัฟเฟอร์ภายในจากนั้นเขียนลงไฟล์ คุณอาจจะแทนที่ด้วยเทียบเท่าหรือสลับกันเขียนออกไปแล้ว${index}.newmv -f "${index}.new" "$index"

date +%sส่งออกวันที่และเวลาปัจจุบันเป็นจำนวนวินาทีจาก Epoch การภาวนานี้ทำงานร่วมกับทั้ง GNU และ BSD dates คุณสามารถเปลี่ยนรูปแบบ (เช่นdate '+%F %T') สำหรับดัชนีที่มนุษย์สามารถอ่านได้หรือแทนที่dateด้วยค่าที่เทียบเท่า


/bin/shเป็น POSIX เชลล์ คุณอาจแทนที่ด้วยเทียบเท่า :)
Blacklight Shining

-1

สิ่งนี้ควรใช้งานได้เช่น 10 ชั่วโมงก่อน:

X=10; find /directory/ -type f -atime $X -exec echo rm -fv {} ';'

- ขณะนี้คือ "เข้าถึงล่าสุด n * 24 ชั่วโมงที่ผ่านมา" ลบ "echo" หากทำในสิ่งที่คุณต้องการ

เช่นเดียวกันสำหรับไฟล์ที่ปรับเปลี่ยนล่าสุดเมื่อหนึ่งชั่วโมงที่ผ่านมาสิ่งนี้ง่ายกว่า:

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