एक फ़ोल्डर में सभी लेकिन सबसे हाल के एक्स सबफ़ोल्डर्स को कैसे हटाएं?


1

मैंने ls का उपयोग करते हुए कुछ एक लाइनर देखे हैं, लेकिन मैं इससे बचना चाहूंगा।

मैं एक स्क्रिप्ट लिख रहा हूं जो टाइमस्टैम्प्ड फ़ोल्डर में मेरे सर्वर पर कोड कॉपी करता है। 'वर्तमान' संस्करण हमेशा एक निरंतर पथ के सममित होता है। इस तरह, अगर कुछ भी गलत हुआ तो मैं वापस रोल कर सकता हूं। अब, हर तैनाती एक नया फ़ोल्डर बनाती है, लेकिन मैं केवल 3 नवीनतम रखना चाहूंगा।

यहाँ मेरा वर्तमान संस्करण है:

ls -tp | grep '/$' | grep -v 'current\|shared' | tail -n +4 | xargs -d '\n' rm -rf --

यह युक्त फ़ोल्डर में निष्पादित किया जाता है, फ़ाइलों को शामिल करता है, और दो फ़ोल्डर्स 'वर्तमान' और 'साझा' जिसे मैं रखना चाहता हूं (वर्तमान में वास्तव में उपरोक्त सिम्लिंक हो रहा है), और सभी को हटा देता है, लेकिन 3 सबसे नए द्वारा छांटे गए ls -t

क्या कोई ऐसा तरीका है जिसके बिना मैं कर सकता हूं ls, और केवल बैश और ग्नू टूलचैन का उपयोग कर रहा हूं ?

छंटाई के लिए बने सभी फ़ोल्डरों को इस प्रारूप का नाम दिया गया है:

$timestamp.$branch.$sha1

जहां SHA1 और शाखा के बारे में जानकारी है कि वास्तव में क्या तैनात किया गया था।

सर्वर Ubuntu Xenial चलाता है।

संपादित करें: फ़ोल्डर जैसा दिखता है, उसके कुछ उदाहरण प्रदान करें

यहाँ तैनाती फ़ोल्डर से एक सूची है, यह अभी कैसे दिखता है:

drwxr-x--- 13 app www-data 4096 Mar 29 00:10 1490738956.develop.b806/
drwxr-x--- 13 app www-data 4096 Mar 29 00:19 1490739485.develop.ae01/
drwxr-x--- 14 app www-data 4096 Mar 29 03:33 1490751118.develop.f5b0/
lrwxrwxrwx  1 app www-data   40 Mar 29 03:33 current -> /home/app/deploy/1490751118.develop.f5b0/
drwx------  5 app root     4096 Mar 10 04:12 shared/

1
क्या आप कुछ नमूने के नाम जोड़ सकते हैं?
चेरोबा

ढूँढें 'x' जहाँ x एक फ़ाइल है से नए आइटम लौटाएगा। आप फ़ाइल को टाइमस्टैम्प के साथ बनाते हैं जिसे आपको स्पर्श का उपयोग करना चाहिए।
djsmiley2k

आपके स्पष्टीकरण से, ऐसा लगता है कि आप "सभी को हटाना चाहते हैं लेकिन एक फ़ोल्डर में सबसे हाल के 3 सबफ़ोल्डर "। क्या ये सही है? यदि हां, तो आपको शीर्षक को तदनुसार संपादित करना चाहिए, अन्यथा कृपया कुछ और जानकारी जोड़ें।
मिलाएं

जवाबों:


1

एक फ़ोल्डर में सभी लेकिन सबसे हाल के 3 सबफ़ोल्डर को कैसे हटाएं?

आप का उपयोग कर सकते find, sort, awk, xargsऔर अंत में rm:

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" -printf "%T@ %p\n" | sort -nr | awk 'NR > 3 {print $2}' | xargs rm -rf

टूट - फूट:

find फ़ाइलों और निर्देशिकाओं को देखने और संभवतः उन पर कमांड निष्पादित करने के लिए बहुमुखी उपकरण

* वर्तमान फ़ोल्डर में तत्वों पर विचार करें

-maxdepth 0 सबफ़ोल्डर्स में मत देखो

-type d निर्देशिका के लिए देखो

-not -path "current" "वर्तमान" नाम की निर्देशिका को बाहर करें

-not -path "shared" "साझा" नाम की निर्देशिका को बाहर करें

-printf "%T@ %p\n"परिणामों को प्रिंट करें, निर्देशिका नामों के सामने टाइमस्टैम्प को जोड़कर। यह आपके मामले में छोड़ा जा सकता है, क्योंकि निर्देशिका पहले से ही समयबद्ध हैं।

| sort -nr टाइमस्टैम्प के अनुसार सूची को उल्टे क्रम में क्रमबद्ध करें

| awk 'NR > 3 {print $2}'पहले जोड़े गए टाइमस्टैम्प को छोड़ते हुए, पहले तीन परिणामों को प्रिंट करें। यह वह जगह है जहां आप चुनते हैं कि कितने को रखना है, बस संख्या को प्रतिस्थापित करें3

| xargs rm -rf उन निर्देशिकाओं और उनकी सभी सामग्रियों को हटा दें

संपादित करें: आपके मामले में, निर्देशिकाओं के नाम पहले से ही टाइमस्टैम्प के साथ शुरू sort -nrहोने के बाद, प्रभावी होने के लिए टाइमस्टैम्प को फिर से जोड़ने की कोई आवश्यकता नहीं है । ध्यान दें कि awkसिंटैक्स को तदनुसार संपादित करने की आवश्यकता है।

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" | sort -nr | awk 'NR > 3 {print $0}' | xargs rm -rf

संदर्भ: देखने के इन दो उपयोगी / समान क्यू एंड ए।


1
अच्छा समाधान, निश्चित नहीं कि निंजा कौन होगा ....
djsmiley2k

0

यह सबसे बुनियादी रूप में है

touch -t 201003160120 some_file
find . -maxdepth  0 -type d ! -newer some_file -name \*.develop.\* -delete

जैसा कि https://serverfault.com/questions/122824/linux-use-find-to-locate-files-older-than-date से लिया गया है

! -newer some_file इसे 'some_file' की तुलना में कुछ भी नया नहीं करने के लिए कहता है

-name \*.develop.\* यह केवल इस पैटर्न से मेल खाने वाले नामों से कहता है (*। अविकसित। *)

-delete- मुझे आशा है कि इसके लिए किसी स्पष्टीकरण की आवश्यकता नहीं है, सावधान रहें! (परीक्षण करते समय उपयोग करें!)

-type d - केवल निर्देशिका

-maxdepth 0 - सबफ़ोल्डर्स में पुनरावृत्ति न करें।


मैंने प्रश्न के लिए एक उदाहरण सूची जोड़ी है। क्या यह एक बेहतर उत्तर प्रदान करने में मदद करता है?
मटकिटो

2
मुझे आपका उत्तर पसंद है, लेकिन मेरी समझ में ओपी पूछ रहा है कि एक्स को सबसे हालिया तत्व कैसे रखा जाए, जहां एक्स एक संख्या है। बाद में उन्होंने कहा कि X = 3.
simlev

वह हमेशा 3 जी फ़ाइल को
सब्सक्राइब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.