खोज के आउटपुट को सॉर्ट करें -exec ls


14

क्या find … -exec ls -ls ;फ़ाइल नाम से, वर्णानुक्रम में सॉर्ट किए गए आउटपुट के लिए संभव है ?

यह मेरी क्रोन कमांड है:

find /home/setefgge/public_html -type f -ctime -1 -exec ls -ls {} \;

यह आदेश ठीक काम करता है, अधिकांश भाग के लिए। लेकिन परिणाम किसी भी सार्थक क्रम में क्रमबद्ध नहीं हैं। यह बहुत उपयोगी होगा यदि वे फ़ाइल नाम फ़ील्ड द्वारा सॉर्ट किए जाएंगे।


1
Zsh का उपयोग कर रहे हैं? ls -ls **/*(.)
केविन

@ केविन काफी नहीं - lsसॉर्ट करेगा।
गिल्स एसओ- बुराई को रोकें '

जवाबों:


14

मुझे लगता है कि आपके फ़ाइल नामों में नई सूचियाँ नहीं हैं।

find /home/setefgge/public_html -type f -ctime -1 -exec ls -nls {} + | sort -k 10

कार्रवाई को समाप्त करने के +बजाय उपयोग करने से इसके चालान को बैचने से तेज हो जाता है । आप कमांड के माध्यम से पाइपिंग द्वारा सॉर्ट कर सकते हैं ; इसे 10 वें क्षेत्र में छांटना शुरू करने के लिए कहें (पहले 9 मेटाडेटा हैं: ब्लॉक, अनुमतियां, लिंक गणना, उपयोगकर्ता, समूह, आकार और 3 दिनांक / समय क्षेत्र)। विकल्प उपयोगकर्ता और समूह के लिए संख्यात्मक मूल्यों का उपयोग करने के लिए कहता है, जो व्हाट्सएप वाले उपयोगकर्ता या समूह के नामों के जोखिम से बचा जाता है।;-execlssort-nls

वैकल्पिक रूप से, zsh के साथ, आप फ़ाइलों को इकट्ठा करने और छाँटने के लिए ग्लोब क्वालिफायर का उपयोग करके किसी भी नाम पर कोई अनुमान नहीं लगा सकते हैं और कई बार zargsचला सकते lsहैं यदि कमांड लाइन बहुत लंबी होगी। आपको जीएनयू ls(विशेषकर इसके) की आवश्यकता है-f फिर से छँटाई से बचने के लिए विकल्प) है ls(दूसरा दृष्टिकोण lszsh के साथ अनुकरण करना होगा zstat)।

autoload -U zargs
zargs -- /home/setefgge/public_html/**/*(.c-2) -- ls -lnsf

आपको बहुत - बहुत धन्यवाद! आपके द्वारा भेजे गए पहले कमांड का उपयोग सॉर्ट करता है। यदि मैं छोटे रास्ते का उपयोग करता हूं तो क्या संख्या अभी भी 10 होगी? उदाहरण के लिए, यदि मैं public_html के बजाय / home / setefgge से समान कमांड चलाता हूं?
MaJ

@ एमएजे 10 स्किप्ड फ़ील्ड्स की संख्या है, इसका फ़ाइल नाम के आकार से कोई लेना-देना नहीं है।
गिल्स एसओ- बुराई को रोकना '

धन्यवाद। मैं आपकी मदद की सराहना करता हूं, और बाकी सभी लोगों की भी मदद करता हूं। मैं इस समस्या का हल मानता हूं। मेरी क्रोन कमांड अब फाइलों को छांट रही है। यह पहली बार है जब मैंने स्टैकएक्सचेंज को एक प्रश्न प्रस्तुत किया है। मुझे "हल" विकल्प नहीं दिखता। यदि आप में से कोई भी इसे हल के रूप में पोस्ट करना जानता है, तो कृपया आगे बढ़ें और ऐसा करें। धन्यवाद!
मैज

@MaJ एक प्रश्न के रूप में हल करने के लिए सबसे करीबी बात यह है कि स्वीकृत उत्तरों में से किसी एक को चिह्नित करना है। केवल आप, पूछने वाला, ऐसा कर सकता है। ऐसा करने के लिए, उस उत्तर के बगल में स्थित चेक मार्क पर क्लिक करें जिससे आपको सबसे अधिक मदद मिली हो। यदि आप एक उत्तर स्वीकार करते हैं, तो आपको 2 और प्रतिष्ठा बिंदु मिलेंगे, और उसके बाद आप पदों को बढ़ा पाएंगे; आप उन सभी पदों को बढ़ा सकते हैं जो आपको मददगार लगे। अधिक जानकारी के लिए, यात्रा पृष्ठ और सहायता पृष्ठ पर देखें कि कोई आपके प्रश्न का उत्तर कब दे
गिल्स एसओ- बुराई को रोकना '

1

पाइप के आधार पर छाँटने के परिणाम को क्यों नहीं मिला और फिर प्रत्येक पंक्ति के लिए ls निष्पादित करें?

find . -type f -ctime -1 | sort | while IFS= read -r filename; do ls -ls "$filename"; done

1

POSIX के पास इस ls -lसूची में तारीखों के बारे में कहने के लिए है :

<date and time>क्षेत्र द्वारा उचित समय है और जब फ़ाइल अंतिम बार संशोधित किया गया था की टाइमस्टैम्प शामिल होगा। POSIX लोकेल में, फ़ील्ड निम्न दिनांक कमांड के आउटपुट के बराबर होगी:

date "+%b %e %H:%M"

... यदि फ़ाइल को पिछले छह महीनों में संशोधित किया गया है, या:

date "+%b %e %Y"

इसे ध्यान में रखते हुए, और यह सुनिश्चित करने के लिए कि अगर किसी फ़ाइल नाम में कोई नई सीमाएँ हैं, तो वे भी POSIX निर्दिष्ट ls -qविकल्प के साथ ग्लोबेड हैं , तो lsपरिणाम के लिए एक रेगेक्स तैयार करना अपेक्षाकृत आसान है find:

d=$(date "+%b %e") y=$(date --date=yesterday "+%b %e")
echo "$d" "$y"

###OUTPUT###
Jul  5 Jul  4

grepउसके लिए और आप केवल उन पंक्तियों को वापस करेंगे जिनमें आज या कल की तारीखों का प्रतिनिधित्व करने वाले तार हैं। निम्न कमांड उस में थोड़ा जोड़ता है:

ls -alRcq | sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

ls विकल्प से मिलकर बनता है:

  1. -a निर्देशिका में सभी फ़ाइलों को वापस लौटाएँ - उनमें से जो एक के साथ शुरू होती हैं .dot
  2. -l लंबी सूची
  3. -R पुनरावर्ती सभी बच्चे निर्देशिकाओं को सूचीबद्ध करें
  4. -c पहुँच समय के बजाय संशोधन समय प्रदर्शित करें
  5. -qफ़ाइल नाम में ?गैर-मुद्रण योग्य या \tab वर्णों के बजाय शेल ग्लोब लौटाएं

उन परिणामों को |pipeफाइल पर पास किया जाता है sedजो केवल मेल खाते हैं:

  1. रिक्त लाइन एक पथनाम और निम्न लाइन से पहले
  2. लाइन्स की शुरुआत - (दूसरे शब्दों में - dडायरेक्टरी के लिए नहीं ) जिसमें आपकी भी होती है date
  3. यह पथनाम लाइनों को तब तक प्रिंट नहीं करता है जब तक कि निर्देशिका में उनका नाम वास्तव में आपके लिए फ़िल्टर की गई फ़ाइलों में न हो।

आउटपुट इस तरह दिखता है:

ls -alRcq --color=always | 
sed "1H;/^-/!{/./d;N;h};/$d\|$y/!d;x;/\n/p;g"

###OUTPUT###
.:
-rw------- 1 mikeserv mikeserv   2086 Jul  4 10:52 .bash_history
-rw------- 1 mikeserv mikeserv   2657 Jul  4 15:20 .lesshst
-rw-r--r-- 1 mikeserv mikeserv    681 Jul  5 05:18 .zdirs
-rw------- 1 mikeserv mikeserv 750583 Jul  5 08:28 .zsh_history
-rw-r--r-- 1 mikeserv mikeserv    166 Jul  4 23:02 Terminology.log
-rw-r--r-- 1 mikeserv mikeserv 433568 Jul  4 13:34 shot-2014-06-22_17-10-16.jpg
-rw-r--r-- 1 mikeserv mikeserv 445192 Jul  4 13:34 shot-2014-06-22_17-11-06.jpg

./.cache/efreet:
-rw------- 1 mikeserv mikeserv  37325 Jul  4 22:51 desktop_localhost_C.eet
-rw------- 1 mikeserv mikeserv  37325 Jul  4 23:30 desktop_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 22:51 desktop_util_localhost_C.eet
-rw------- 1 mikeserv mikeserv  24090 Jul  4 23:30 desktop_util_localhost_en_US.eet
-rw------- 1 mikeserv mikeserv  16037 Jul  4 23:30 icon_themes_localhost.eet
-rw------- 1 mikeserv mikeserv   3117 Jul  4 23:30 icons___efreet_fallback_localhost.eet
-rw------- 1 mikeserv mikeserv 768039 Jul  4 23:30 icons_gnome_localhost.eet
-rw------- 1 mikeserv mikeserv  18589 Jul  4 23:30 icons_hicolor_localhost.eet

./.config:
-rw-r--r-- 1 mikeserv mikeserv   30 Jul  4 19:10 pavucontrol.ini

./.config/chrome:
-rw-r--r-- 1 mikeserv mikeserv 94332179 Jul  4 13:36 conf.tar.lz4.bak

हाँ, यह भी साथ काम करता है LS_COLORS- जो आपके cronपाठ्यक्रम के लिए शायद कम प्राथमिकता है , लेकिन, आपके विकल्प खुले हैं।

किसी भी मामले में यह कुछ अन्य संभावित समाधानों पर कुछ महत्वपूर्ण लाभ प्रदान करता है।

  1. पहली जगह में find+ lsकई चालान शामिल हैं - इसमें केवल एक ही lsप्रक्रिया शामिल है , और यही कारण है कि यह मज़बूती से सब कुछ छाँटने में सक्षम है - जो यह डिफ़ॉल्ट रूप से करता है - और इसलिए sortइसे सहायक भी बनाया जाता है।

  2. किसी भी समाधान को शामिल findऔर sortऔर lsकाफी कर रही है सभी दो बार काम का। lsऔर findदोनों हर pathname और statहर फ़ाइल को हल करेंगे । lsऔर sortदोनों सभी परिणामों को क्रमबद्ध करेंगे। यह केवल एकल का उपयोग करने के बजाय शायद सबसे अच्छा है ls

  3. तो ज़ाहिर है वहाँ dateऔर sedइस उत्तर के कुछ भागों। इस बात पर ध्यान देना ज़रूरी है कि आप कठिन भाग करते हैं और पहले regex प्राप्त करते हैं - और केवल एक बार - और बाद में आप केवल कहने के बजाय परिणामों की एक ही सूची prune करते हैं, परिणाम प्राप्त करते हैं, परिणाम प्राप्त करते हैं, परिणाम और क्रमबद्ध परिणाम प्राप्त करते हैं।

  4. यह नए नाम वाले फ़ाइलनामों पर नहीं टूटता, जैसा कि अन्य समाधानों में होगा। इस समाधान के पास अपने स्वयं के कैविएट हैं - जिन्हें मैं आगे समझाता हूं - लेकिन वे मिनट हैं और आसानी से नियंत्रित होते हैं। मेरी राय में, यह यहां सबसे मजबूत समाधान है।

ऐसे दो मामले हैं जिनमें उपरोक्त आदेश से आपको समस्या हो सकती है। पहले में ?फिल्नाम में ग्लब्स शामिल हैं - जबकि यह पहले से ही यहां पेश किए गए किसी भी अन्य की तुलना में अधिक मजबूत समाधान है, और इस बात की संभावना है कि आप ?सभी का सामना अपने आप में काफी छोटा है, इस बात की संभावना है कि उन ग्लोब को हल करने की संभावना है। एक से अधिक फ़ाइल नाम से मेल खा सकता है। कृपया इस विषय पर अधिक जानकारी के लिए इसे देखें ।

दूसरी संभावना में एक गलत सकारात्मक शामिल है - उदाहरण के लिए यदि आपके पास एक फ़ाइलनाम है जो वास्तव में उस dateस्ट्रिंग से मेल खाता है जिसके लिए हम खोज कर रहे हैं grepलेकिन यह वास्तव में उन दिनों में से किसी पर भी संशोधित नहीं किया गया था। मैं इस बात पर भरोसा नहीं कर रहा हूं कि यह एक मुद्दा है, लेकिन, अगर यह है, तो इसके बारे में पूछें और मैं शायद इसे संभालने के लिए रेक्स को अधिक विशिष्ट बनाने में आपकी मदद कर सकता हूं।


0

आप वास्तव में खोज, xargs और ls के संयोजन का उपयोग कर सकते हैं।

यहाँ एक नमूना आदेश दिया गया है: find . -type f -print0 | xargs -0 ls -lt

  • find वर्तमान निर्देशिका के अंतर्गत सभी फ़ाइलों के लिए पुन: खोज करेगा।
  • xargs lsएक सिंगल कॉल में कमांड की फाइलों की इस सूची को पास करेगा (बशर्ते फाइलों findसे कम रिटर्न ARG_MAX)।
  • ls -lt समय के अनुसार इन फ़ाइलों को सॉर्ट करेगा और आउटपुट स्वरूपित करेगा

अपने सिस्टम को पुनः प्राप्त करने के लिए ARG_MAXआप टाइप कर सकते हैं:

$ getconf ARG_MAX
> 2621440

-1
ls -l $(find /home/setefgge/public_html -type f -ctime -1 | sort)

1
lsअपनी खुद की छँटाई करता है, इसलिए के findमाध्यम से उत्पादन पाइपिंग sortबेकार है। इसके अलावा आपके कमांड में व्हॉट्सएप (दूसरों के बीच) नाम दर्ज हैं और अगर बहुत सारे फ़ाइल नाम हैं तो वे विफल हो जाएंगे।
गिल्स एसओ- बुराई को रोकना '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.