स्वत: पूर्ण नवीनतम फ़ाइल


13

मेरे पास एक ऐसी प्रक्रिया है जो टेक्स्ट फाइल बनाती है, जिनके फाइलनेम उनके निर्माण के समय के टाइमस्टैम्प पर आधारित हैं:

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

मैं नवीनतम बनाई गई फ़ाइल के फ़ाइलनाम को कैसे पूरा कर सकता हूं , अर्थात नवीनतम माइम वाली फ़ाइल? इन फ़ाइलों के लिए टैब-पूर्णता का उपयोग करने का कोई तरीका नहीं है क्योंकि फ़ाइल नाम में लगभग हर वर्ण किसी अन्य फ़ाइल के साथ साझा किया गया है। मैं एक शॉर्टकट खोजने की उम्मीद कर रहा हूं (जैसे कि Alt .कौन सी कमांड अंतिम आदेश के अंतिम तर्क को स्वतः पूर्ण करता है)। मैं निम्नलिखित उर्फ जो के लिए अच्छा है गढ़ना में कामयाब रहे VIM, लेकिन मुझे पता है कि एक सामान्य प्रयोजन शॉर्टकट मौजूद है कि मैं के साथ इस्तेमाल कर सकते हैं प्यार होता kde-open, sqlite3, और अन्य अनुप्रयोगों।

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


वह सब पढ़ने के बाद, इस सवाल का कोई संतोषजनक जवाब नहीं है कि कैसे बश खोल में नवीनतम फाइलपाथ (एक ला बैश पूरा, और उम्मीद है कि कालानुक्रमिक क्रम के माध्यम से भी) डालने के लिए एक कीबोर्ड शॉर्टकट है?
रोमन सूसी Roman ’

@ रोमनसुसी: यह निकटतम उत्तर वीडेनरिंडे द्वारा है, लेकिन यह केवल एक शाब्दिक $(ls -t|head -1)पंक्ति में सम्मिलित करता है । इसलिए, कोई साइकिल नहीं। संतोषजनक उत्तर के अभाव में, मैंने उस उत्तर को स्वीकार कर लिया, जिसने मुझे सबसे अधिक सिखाया और सबसे अधिक उपयोगिता प्रदान की।
डॉटनचेन '’

ज़रूर। यह सिर्फ मेरे लिए यह एक शांत खोल सुविधा हो सकता है, और सोचा कि क्यों किसी ने अभी तक इसे लागू नहीं किया।
रोमन सूसी

जवाबों:


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 बैश के समान है, आप शायद इसे बैश - सुविधा- / उपयोग-वार का सुपरसेट कह सकते हैं।

लेकिन शायद बैश में एक समान विशेषता है।


धन्यवाद, यह बहुत अच्छा है। कुछ कारणों से मैं इसे स्थानांतरित नहीं करना पसंद zshकरता हूं, लेकिन अगर मैं कभी ऐसा करता हूं, तो मेरे पास यह बुकमार्क है!
dotancohen

मुझे पेश करने के लिए धन्यवाद zsh!

3

चूँकि नवीनतम फ़ाइल भी अंतिम क्रमबद्ध है, आप उपयोग कर सकते हैं menu-complete-backwardmenu-completeऔर menu-complete-backwardचक्रों को पूरा करके या पहले या अंतिम पूर्ण को सम्मिलित करें। मैंने उन्हें विकल्प-टैब और शिफ्ट-टैब में बाध्य किया है ~/.inputrc:

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

\e[Zजब आप शिफ्ट-टैब दबाते हैं तो आपका टर्मिनल एमुलेटर नहीं डाल सकता है । जब आप किसी कुंजी संयोजन को दबाते हैं तो पाठ को सम्मिलित करने के लिए उपयोग करें C-vया cat -vदेखें।


वास्तव में, फाइलें वर्णानुक्रम में क्रमबद्ध होती हैं, कालानुक्रमिक रूप से नहीं। अगर मैं यह पता लगाऊं कि क्रोनोलॉजिकली कैसे छांटा जाए, तो मैं जानकारी के साथ अपडेट करूंगा।
डॉटंचोहेन

2

प्रश्न के लिए पृष्ठभूमि उपयोग की गति है। मुझे एक कीबोर्ड मैक्रो सबसे उपयुक्त लगता है। इसमें जोड़ें ~/.inputrc:

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

आगे के विचार: मूल रूप से, मुझे कुछ ऐसा चाहिए था, जो मुझे पहली, दूसरी, तीसरी सबसे नई फाइल प्रदान करे। एक विचार एक टोकन के साथ स्थानों को चिह्नित करने के लिए होगा, उदाहरण के लिए "grep x _", फिर एक कीबोर्ड मैक्रो निष्पादित करें "\ C-alatest-extension \ Cm" और "नवीनतम-विस्तार" एक शाप-चयन सूची से चुनने के लिए संकेत देता है कमांड लाइन में प्रत्येक "_" टोकन के लिए नवीनतम फाइलें।

मैं इसे एक महत्वपूर्ण प्रश्न मानता हूं, क्योंकि SHELL पर GUI का एक शेष लाभ मेरे लिए हाल ही में उपयोग की गई / बनाई गई फ़ाइलों और निर्देशिकाओं का चयन है। autojumpनिर्देशिकाओं के लिए थोड़ी मदद करता है, फ़ाइलों के लिए एक समाधान गायब है।


धन्यवाद, यह मददगार है। ध्यान दें कि यह $(ls -t|head -1)बैश लाइन में शाब्दिक रूप से सम्मिलित होता है , इसलिए इसे व्याख्या करने की आवश्यकता होती है। यह इसे कम उपयोगी बनाता है, लेकिन यह अभी भी एक अच्छी चाल है।
१०:३४ पर डोटानचेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.