รับไดเรกทอรีล่าสุด (ไม่ใช่ไฟล์ล่าสุด)


15

โฟลเดอร์ของฉันparentมีเนื้อหาดังต่อไปนี้:

A.Folder B.Folder C.File

มันมีทั้งโฟลเดอร์และไฟล์ภายใน B.Folderใหม่กว่านี้ ตอนนี้ฉันแค่อยากได้B.Folderฉันจะทำสิ่งนี้ได้อย่างไร ฉันลองสิ่งนี้

ls -ltr ./parent | grep '^d' | tail -1

แต่มันทำให้ฉันแต่ฉันเพียงแค่ต้องชื่อdrwxrwxr-x 2 user user 4096 Jun 13 10:53 B.FolderB.Folder


1
ใช้สิ่งนี้ls -ltr ./parent | grep '^d' | tail -1| awk '{print $NF}'
بارپابابا

การใช้ awk ใช้งานได้ แต่ฉันต้องการดูว่ามีวิธีแก้ปัญหาที่สะอาดกว่านี้หรือไม่ :)
แดเนียล

หา -maxdepth 1 -type d | TZ = utc xargs ls -ld --full-time | จัดเรียง -k 6
ctrl-alt-delor

คำตอบ:


24

ลองสิ่งนี้:

$ ls -td -- */ | head -n 1

-tตัวเลือกทำการlsจัดเรียงตามเวลาการแก้ไขใหม่สุดก่อน

หากคุณต้องการลบ/:

$ ls -td -- */ | head -n 1 | cut -d'/' -f1

1
วิธีกำจัดเฉือน/?
แดเนียล

สิ่งนี้ไม่ทำงานหากคุณอยู่ในโฟลเดอร์อื่น ฉันหมายถึงls -td -- ./parent | head -n 1ไม่ให้ผลลัพธ์ที่ถูกต้องฉันต้องใช้ subshell เช่นcd ./parentทุกครั้งและดำเนินการคำสั่งนี้หรือไม่ ทางออกใด ๆ
แดเนียล

@Daniel: คุณต้องเรียกใช้คำตอบของฉันในไดเรกทอรีการทำงานปัจจุบันเพื่อให้ทำงานได้ มิฉะนั้นคุณต้องใช้เส้นทางสัมพัทธ์เช่นคำตอบของ Herson
cuonglm

การลบครั้งสุดท้าย / ไม่ทำงาน ตัวอย่าง: / home / cuo / bin / คาดว่า: / home / cuo / bin
Marius

5
ls -td -- ./parent/*/ | head -n1 | cut -d'/' -f2

ความแตกต่างในการแก้ปัญหาของ Hersonคือการเฉือนหลังจาก*ซึ่งทำให้เชลล์เพิกเฉยต่อไฟล์ที่ไม่ใช่ไฟล์ทั้งหมด ความแตกต่างของGnoucจะใช้งานได้หากคุณอยู่ในโฟลเดอร์อื่น

Cut จำเป็นต้องทราบจำนวนไดเรกทอรีหลัก (2) เพื่อที่จะลบ '/' ต่อท้าย หากคุณไม่มีสิ่งนั้นให้ใช้

VAR=$(ls -dt -- parent/*/ | head -n1); echo "${VAR::-1}"

3

คำตอบ zsh บังคับ:

latest_directory=(parent/*(/om[1]))

อักขระในวงเล็บคือตัวระบุแบบกลม : /เพื่อจับคู่เฉพาะไดเรกทอรีomเรียงลำดับการจับคู่ตามอายุที่เพิ่มขึ้นและ[1]เพื่อคงการจับคู่แรก (เช่นล่าสุด) เท่านั้น เพิ่มNถ้าคุณต้องการที่จะได้รับอาร์เรย์ที่ว่างเปล่า (ปกติคุณจะได้รับอาร์เรย์ 1 Elementy) parentถ้ามีไดเรกทอรีย่อยไม่

อีกทางหนึ่งสมมติว่าparentไม่มีอักขระตัวใดตัวหนึ่งที่อยู่รอบตัว:

latest_directory='parent/*(/om[1])'; latest_directory=$~latest_directory

หากคุณไม่มี zsh แต่คุณมีเครื่องมือ GNU ล่าสุด (เช่น Linux ที่ไม่ได้ฝังตัวหรือ Cygwin) คุณสามารถใช้findแต่ก็ยุ่งยาก นี่คือวิธีหนึ่ง:

latest_directory_inode=$(find parent -mindepth 1 -maxdepth 1 -type d -printf '%Ts %i\n' | sort -n | sed -n '1 s/.* //p')
latest_directory=$(find parent -maxdepth 1 -inum "$latest_directory_inode")

มีวิธีแก้ปัญหาง่ายๆด้วยlsซึ่งทำงานได้ตราบใดที่ไม่มีชื่อไดเรกทอรีที่มีบรรทัดใหม่หรือ (ในบางระบบ) อักขระที่ไม่สามารถพิมพ์ได้:

latest_directory=$(ls -td parent/*/ | head -n1)
latest_directory=${latest_directory%/}


2

คำสั่งดังต่อไปนี้จะทำงานแม้ในกรณีของชื่อไดเรกทอรีที่มีช่องว่าง:

cp `find . -mindepth 1 -maxdepth 1 -type d  -exec stat --printf="%Y\t%n\n" {} \;  |sort -n -r |head -1 |cut -f2'`/* /target-directory/.

คำอธิบายที่ปรับปรุงแล้วของเนื้อหาใน backticks คือ:

  • . - ไดเรกทอรีปัจจุบัน (คุณอาจต้องการระบุพา ธ สัมบูรณ์ที่นี่)
  • -mindepth/-maxdepth - จำกัด คำสั่ง find ให้กับชายด์ทันทีของไดเร็กทอรีปัจจุบัน
  • -type d - ไดเรกทอรีเท่านั้น
  • -exec stat .. - เอาท์พุทเวลาที่แก้ไขและชื่อของไดเรกทอรีจากการค้นหาคั่นด้วยแท็บ (และไม่เว้นวรรค)
  • sort -n -r |head -1 | cut -f2 - วันที่สั่งไดเรกทอรีและเอาท์พุทชื่อทั้งหมดของการแก้ไขล่าสุด (แม้ว่าจะมีพื้นที่บางส่วนเป็นแท็บตัวคั่นเริ่มต้นตัด)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.