เติมไฟล์อัตโนมัติใหม่ล่าสุด


13

ฉันมีกระบวนการที่สร้างไฟล์ข้อความที่มีชื่อไฟล์ตามการประทับเวลาของช่วงเวลาของการสร้าง:

$ ls
1378971222.txt
1378971254.txt
1378971482.txt
1378971488.txt
1378972089.txt
1378972140.txt
1378972141.txt
1378972153.txt
1378972155.txt
1378972241.txt

ฉันจะเติมชื่อไฟล์ของไฟล์ที่สร้างล่าสุดโดยอัตโนมัติเช่นไฟล์ที่มี mtime ล่าสุดได้อย่างไร ไม่มีวิธีที่จะใช้ Tab-completion สำหรับไฟล์เหล่านี้เนื่องจากตัวละครเกือบทุกตัวในชื่อไฟล์จะถูกแชร์กับไฟล์อื่น ฉันหวังว่าจะหาทางลัด (เช่นการAlt .เติมข้อความอัตโนมัติครั้งสุดท้ายของคำสั่งสุดท้าย) ฉันมีการจัดการที่จะกุเรื่องนามแฝงต่อไปนี้ซึ่งเป็นที่ดีสำหรับVIMแต่ฉันชอบที่จะทราบว่าทางลัดวัตถุประสงค์ทั่วไปอยู่ที่ฉันสามารถใช้กับkde-open, sqlite3และการใช้งานอื่น ๆ

alias lastest="vim `ls -t | grep -vE "^total [0-9]*$" | head -n1`"


เมื่ออ่านทั้งหมดแล้วคำถามดูเหมือนจะยังไม่มีคำตอบที่น่าพอใจเกี่ยวกับวิธีการใช้แป้นพิมพ์ลัดในการแทรกไฟล์พา ธ ล่าสุด (a la bash complete และหวังว่าจะเป็นไปตามลำดับเหตุการณ์) ใน bash shell ด้วย?
Roman Susi

@RomanSusi: คำตอบที่ใกล้ที่สุดนี้คือโดย Weidenrinde แต่จะแทรกตัวอักษร$(ls -t|head -1)ลงในบรรทัดเท่านั้น ดังนั้นไม่ต้องปั่นจักรยาน ในกรณีที่ไม่มีคำตอบที่น่าพอใจฉันยอมรับคำตอบที่สอนฉันมากที่สุดและให้ประโยชน์สูงสุด
dotancohen

แน่ใจ มันเพิ่งจะเกิดขึ้นกับฉันมันอาจจะเป็นคุณสมบัติเปลือกหอยที่ยอดเยี่ยมและสงสัยว่าทำไมยังไม่มีใครนำมันมาใช้
Roman Susi

คำตอบ:


6

เพียงลบออกvimจากนามแฝง ทำสิ่งนี้:

alias latest='ls -tr | tail -n 1'

จากนั้นคุณสามารถใช้โปรแกรมใด ๆ เพื่อเปิดไฟล์ล่าสุด:

emacs `latest`
ls `latest`
mv `latest` ../

เป็นต้น

แต่นี้จะแตกถ้าชื่อไฟล์ของคุณมีช่องว่างหรืออักขระแปลกซึ่งเป็นเหตุผลที่คุณไม่ควรแยก lsวิธีที่ดีกว่าจะเป็นแบบนี้ (เพิ่มในของคุณ.bashrc)

function latest(){
  $1 "$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)"
}

ฟังก์ชั่นนี้จะรันคำสั่งอะไรก็ตามที่คุณให้เป็นอาร์กิวเมนต์และส่งผ่านผลลัพธ์ของการfindโทร (ไฟล์ล่าสุด) ไปยังคำสั่งนั้น ดังนั้นคุณสามารถทำสิ่งต่าง ๆ เช่น:

latest emacs
latest less

หากคุณต้องการทำสิ่งต่าง ๆ เช่นmv $(latest) foo/ลองทำสิ่งนี้แทน:

function latest(){
   A=(${@})
   prog=$1;
   lat=$(find . -type f -printf "%C@ %p\n" | sort | tail -n 1 | cut -d " " -f 2-)
   if [ ! -z $2 ] ; then 
     args=${A[@]:1}; 
     $prog "$lat" "${A[@]:1}"
   else
     $prog "$lat"
   fi
}

จากนั้นหากต้องการคัดลอกไฟล์ล่าสุดไปที่bar/คุณต้องทำ

latest cp bar

และคุณยังสามารถทำlatest emacsเช่นเดียวกับเมื่อก่อน


ขอบคุณมีบางสิ่งที่ฉันสามารถเรียนรู้ได้ที่นี่
dotancohen

ฉันอยากจะแนะนำalias latest='\ls -tr | tail -n 1'- มันจะทำงานถ้าคุณมีlsนามแฝง
domen

6

คุณสามารถกำหนดค่าสิ่งนี้ในzshเช่นกับสิ่งนี้:

zstyle ':completion:*' file-sort date

(คุณสามารถเปลี่ยนบรรทัดที่สไตล์นี้ใช้สำหรับรูปแบบชื่อไฟล์บางอย่างเท่านั้น)

zsh คล้ายกับทุบตีมากคุณอาจเรียกมันว่า superset of bash - feature- / use-wise

แต่บางทีทุบตีมีคุณสมบัติที่คล้ายกัน


ขอบคุณนี่เยี่ยมมาก ด้วยเหตุผลบางอย่างที่ฉันไม่ต้องการย้ายไปzshแต่ถ้าฉันเคยฉันมีบุ๊คมาร์คนี้!
dotancohen

ขอบคุณที่แนะนำฉันให้รู้จักzsh!
dotancohen

3

menu-complete-backwardตั้งแต่ไฟล์ใหม่จะเรียงยังสุดท้ายคุณสามารถใช้ menu-completeและmenu-complete-backwardวนผ่านความสำเร็จหรือแทรกความสำเร็จครั้งแรกหรือครั้งสุดท้าย ฉันผูกมันไว้กับ option-tab และ shift-tab ใน~/.inputrc:

"\e\t": menu-complete
"\e[Z": menu-complete-backward

เทอร์มินัลอีมูเลเตอร์ของคุณอาจไม่แทรก\e[Zเมื่อคุณกด shift-tab ใช้C-vหรือcat -vเพื่อดูข้อความที่ถูกแทรกเมื่อคุณกดคีย์ผสม


ในความเป็นจริงไฟล์จะถูกจัดเรียงตามตัวอักษรไม่ใช่ตามลำดับเวลา ถ้าฉันหาวิธีเรียงลำดับตามลำดับฉันจะอัพเดทด้วยข้อมูล
dotancohen

2

พื้นหลังของคำถามคือความเร็วในการใช้งาน ฉันพบมาโครคีย์บอร์ดที่เหมาะสมที่สุด เพิ่มไปที่~/.inputrc:

# Alt-L --> newest file in directory
"\el": "$(ls -t|head -1)"

แนวคิดเพิ่มเติม:เดิมทีฉันต้องการสิ่งที่ให้ไฟล์ใหม่ล่าสุดอันดับ 1, 2 และ 3 มีความคิดที่จะทำเครื่องหมายสถานที่ด้วยโทเค็นเช่น "grep x _" จากนั้นเรียกใช้แมโครแป้นพิมพ์ "\ C-alatest-expansion \ Cm" และ "ส่วนขยายล่าสุด" แจ้งให้เลือกรายการคำสาปเพื่อเลือกจาก ไฟล์ล่าสุดสำหรับโทเค็น "_" แต่ละรายการในบรรทัดคำสั่ง

ฉันคิดว่านี่เป็นคำถามที่สำคัญเพราะข้อได้เปรียบที่เหลืออีกข้อหนึ่งของ GUI สำหรับ SHELL สำหรับฉันคือการเลือกไฟล์และไดเรกทอรีที่สร้างขึ้นเมื่อเร็ว ๆ นี้ autojumpช่วยให้บิตสำหรับไดเรกทอรีการแก้ปัญหาสำหรับไฟล์หายไป


ขอบคุณที่เป็นประโยชน์ โปรดทราบว่ามันแทรกตัวอักษร$(ls -t|head -1)ลงใน bash line ดังนั้นจึงจำเป็นต้องตีความ มันทำให้มีประโยชน์น้อยกว่า แต่ก็ยังเป็นเคล็ดลับที่ดี
dotancohen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.