จัดเรียงไฟล์ในไดเรกทอรีซ้ำตามวันที่แก้ไขล่าสุด


11

จัดเรียงไฟล์ในไดเรกทอรีซ้ำตามวันที่แก้ไขล่าสุด

ฉันได้แก้ไขไฟล์จำนวนมากในไดเรกทอรีของฉันต้องการทราบว่าไฟล์เหล่านั้นคืออะไรโดยเรียงลำดับตามวันที่แก้ไขล่าสุดและฉันต้องการให้ส่วนขยายบางส่วนถูกแยกออก

ในไดเรกทอรี svn ฉันมีไฟล์. svn จำนวนมากเช่นกันซึ่งฉันไม่ต้องการแสดงในการเรียงลำดับ


ฉันสาธิตวิธียกเว้นส่วนขยายในคำตอบของฉัน
mikeserv

คำตอบ:


18
find -printf "%TY-%Tm-%Td %TT %p\n" | sort -n

จะให้สิ่งที่คุณต้องการ

2014-03-31 04: 10: 54.8596422640 ./foo
2014-04-01 01: 02: 11.9635521720 ./bar


ฉันสามารถแยกนามสกุลไฟล์ออกจากโฟลเดอร์ได้ไหม?
Danny

@Danny find -not -iname '*.ext'ใช่ว่าเป็นเรื่องง่ายด้วยพบ:
n.st

พบ -Not -path " SVN " -Not -name "* SVN" -printf "% TY-% TM-% Td% TT p% \ n" | การจัดเรียง -n ตรงนี้เป็นสิ่งที่ผมต้องขอบคุณมาก @ n.st
แดนนี่

5

หากคุณต้องการทำให้โครงสร้างไดเร็กทอรีเรียบ (ดังนั้นการเรียงลำดับตามวันที่ในไฟล์ทั้งหมดในไดเรกทอรีทั้งหมดโดยไม่สนใจว่ามีไฟล์ใดอยู่ในfindไดเร็กทอรี) -approach ที่ @yeti แนะนำคือวิธีการที่จะไป หากคุณต้องการรักษาโครงสร้างไดเรกทอรีคุณอาจลอง

$ ls -ltR /path/to/directory

ซึ่งเรียงลำดับไดเรกทอรีตาม


1
นี่ให้โฟลเดอร์ที่ชาญฉลาดซึ่งสิ่งที่ฉันต้องการก็คือไฟล์ที่ถูกแก้ไขเมื่อไม่นานมานี้
Danny

5

ใน bash ให้รันshopt -s globstarก่อน ใน ksh93 ให้รันset -o globstarก่อน ใน zsh คุณได้ตั้งค่าไว้แล้ว

ls -dltr **/*

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

print -rl -- **/*(Om)

นี่เป็นคำตอบเดียวที่นี่สำหรับ Solaris 10 ขอบคุณ! :)
laxxy

3

สมมติว่าคุณใช้ usuig GNU ลองดู:

find $SOMEPATH -exec stat -c '%Y %n' '{}' + | sort -n

1
คุณสามารถใช้find's -printfตัวเลือกที่จะหลีกเลี่ยงการกล่าวอ้างกระบวนการแยก (หรือหลายขึ้นอยู่กับจำนวนของไฟล์) ดูคำตอบของฉันสำหรับตัวอย่าง
n.st

1
รู้ว่ามีวิธีอื่นที่จะทำมันผมอยากจะให้statโอกาสและ-exec ... +การแสดง จริงๆ! บางครั้งฉันคิดว่าstatสมควรได้รับความสนใจมากขึ้น ... และไม่มีใครควรใช้สูตรจากที่นี่โดยไม่ต้องอ่านเกี่ยวกับส่วนผสมและคิดเกี่ยวกับผลที่ตามมา ...

Btw ... ไม่ใช่ทุกการค้นหาที่มี-printf...

1
@yeti - หากคุณfindไม่ได้มี-printf, คุณสามารถใช้-exec sh -c 'printf...'เพื่อให้ได้มากจากการทำงานเดียวกัน ซึ่งจะรวมถึงการเข้าถึง$(pwd)เส้นทางที่ผ่านการรับรองอย่างสมบูรณ์เช่นกัน
mikeserv

2
statผมได้พบกับผู้ใช้จำนวนมากลินุกซ์ไม่เคยอ่านเกี่ยวกับ ดังนั้นบางครั้งฉันต้องการที่จะนำความสนใจบางอย่างในstat... ฉันคิดว่าstatมันสมควร ...

2

หากต้องการแสดงชื่อไฟล์อย่างแน่นหนาโดยใช้เครื่องมือ GNU ล่าสุด:

find . -printf '%A@ %p\0' |
  sort -nz |
  sed -z 's/^[^ ]* //' |
  tr '\0' '\n'

2
find $DIR -depth -maxdepth 3 \
    -type d -readable -printf \
    'printf "\\n%p\\n"
    ls -t --color=always "%p"\n' |\
    . /dev/stdin 2>&-

สิ่งนี้จะหลีกเลี่ยงปัญหารายการอาร์กิวเมนต์ใด ๆ เนื่องจากอาร์กิวเมนต์เพียงอย่างเดียวที่lsจะได้รับคือชื่อของไดเรกทอรีที่คุณต้องการแสดงรายการ คุณสามารถทำสิ่งนี้ได้ทุกอย่างที่คุณต้องการ

เปลือกเพียงเป็นสคริปต์เปลือก - เป็นกระบวนการเดียวกันและไม่ได้มีปัญหาที่คุณสามารถพบเมื่อถูกเรียกว่า. sources|pipeexecve

ในกรณีใด ๆ - maxdepthด้านบนเพียงไปสามลึกซึ่งสามารถปรับได้โดยการเปลี่ยน นอกจากนี้ยังเป็นครั้งแรกลึก - depthดังนั้นคุณทำงานย้อนกลับทางของคุณไปยังไดเรกทอรีปัจจุบันของคุณจาก

คุณอาจสังเกตเห็นว่าคุณได้รับ$LSCOLORS- บนเครื่องของฉันมันยังมีคอลัมน์ที่พิมพ์อย่างประณีตและทุกสิ่งที่คุณต้องการจากls- หรือสำหรับเรื่องนั้นสิ่งใดก็ตามที่คุณนึกได้ว่าคุณอยากจะทำ. source.

ไม่มี SVN

lsอีกครั้งนี้จะทำทุกอย่างที่คุณคาดหวังของ ดังนั้นการซ่อน.svnไฟล์ทำได้ง่ายเพียงแค่เปลี่ยนlsบรรทัดเป็น:

ls -t --color=always --hide="*svn" "%p"\n

หรือถ้าคุณต้องการที่จะเห็นsvnส่วนขยายในทุก ๆ โฟลเดอร์ แต่./svnคุณสามารถเปลี่ยนมันได้ดังนั้นคำสั่งทั้งหมดจะเป็นดังนี้:

    find $DIR -depth -maxdepth 3 \
        -type d -readable -printf \
            'printf "\\n%p\\n" ; hide=
            [ "%p" = "./svn" ] && hide="*svn"
            ls -t --color=always --hide="$hide" "%p"\n' |\
    . /dev/stdin 2>&-

โดยส่วนตัวแล้วฉันชอบมันด้วย ls -sและถ้าคุณสนใจ-uจะเรียงลำดับตามเวลาเข้าถึงมากกว่าเวลา mod


1

หนึ่งนี้จะแสดงรายการทั้งหมดfiles ใน<dir>ที่มีความเป็นอยู่ที่เก่าแก่ที่สุดบนสุดมีการปรับเปลี่ยน

find <dir> -type f -print0 | xargs -0 ls -ltr

และด้วยสิ่งนี้การปรับเปลี่ยนครั้งล่าสุดจึงเป็นระดับสูงสุด

find <dir> -type f -print0 | xargs -0 ls -lt

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


จริงฉันลืมไปเลยว่า
UnX

สำหรับการอ้างอิงเกี่ยวกับคำสั่ง: รายการ arg ยาวเกินไป in-ulm.de/~mascheck/various/argmax
UnX

@Gilles: คุณหมายถึงxargs -0(ในทั้งสองกรณี)  xargs -print0เทียบเท่าxargs -p -r -i -n -t -0หรือxargs -inprt0หรือxargs -0ntripซึ่งอาจไม่ใช่สิ่งที่คุณหมายถึง
สกอตต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.