मेरे पास 639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav जैसे प्रारूप में फ़ाइलें हैं। फ़ाइलें एक फ़ोल्डर और उप-फ़ोल्डर प्रारूप में रहती हैं जो एक तिथि के समान होती है। ./2019/05/31/639486572_016b0f3d-9ec3-4ad1-84ae-c98b68390322.wav.

लक्ष्य _ से पहले और उसमें शामिल सभी चीज़ों को हटाना है। जो मैं rename -v 's/$\.+_//' के साथ करने में सक्षम हूं

लेकिन जब मैं इसे find के साथ जोड़ने की कोशिश करता हूं तो ऐसा लगता है कि सबफ़ोल्डर में मिली सभी फ़ाइलों का नाम सही ढंग से बदल जाता है, लेकिन उन्हें इस मामले में काम करने वाले फ़ोल्डर की जड़ में ले जाता है।/2019

कमांड चल रहा है find -type f -name "*_*" | rename -v 's/$\.+_//'

मैं कैसे सुनिश्चित कर सकता हूं कि फाइलों का स्थान नहीं बदलता है?

1
Murda Ralph 23 जिंदा 2020, 18:34

1 उत्तर

सबसे बढ़िया उत्तर

$\ अपरिभाषित होगा और आपके रेगुलर एक्सप्रेशन में कुछ नहीं करेगा।

.+_ स्ट्रिंग की शुरुआत से लेकर अंतिम _ वर्ण तक, पथ की जानकारी सहित, सभी चीज़ों से मेल खाएगा। आप एक अधिक प्रतिबंधात्मक अभिव्यक्ति का उपयोग करना चाहेंगे जो पूरे पथ पर कब्जा नहीं करेगा।

आप इसे कुछ तरीके से कर सकते हैं:

s![^/]+_!!        greedy match of consecutive non-/ chars

s!(.+/)?.+_!$1!   capture path and include it in the replacement

एक समाधान भी है जो नकारात्मक दिखने वाले दावे का उपयोग करेगा, जब आप कीड़े के उस डिब्बे को खोलने के लिए तैयार हों।

0
mob 23 जिंदा 2020, 15:48