आप एक ही फ़ाइल नाम उपसर्ग के साथ निर्देशिका में सभी फ़ाइलों को (या कॉपी) कैसे स्थानांतरित कर सकते हैं?


9

बैश का उपयोग करना

तो मान लें कि मेरे पास एक मूल निर्देशिका में यादृच्छिक रूप से रखी गई फ़ाइलों का एक गुच्छा है ~/src, मैं एक निश्चित प्रत्यय से मेल खाते सभी फाइलों को हथियाना चाहता हूं और उन्हें ~/distनिर्देशिका में स्थानांतरित (या कॉपी) करना चाहता हूं ।

आइए इस उद्देश्य के लिए मान लें कि सभी फ़ाइलनामों में यह नामकरण सम्मेलन है:

<filename_prefix>.<filename_suffix>

मुझे पता चला कि यह एक विशेष filename_suffixफ़ोल्डर के साथ सभी फ़ाइलों को प्राप्त करने और उन्हें एक परेशान फ़ोल्डर में डालने का एक त्वरित तरीका था :

mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

अब एक कदम आगे ... मैं इस मामले में खोज के आउटपुट का उपयोग कैसे कर सकता हूं filename, और filename_prefixउसी नाम की एक निर्देशिका उत्पन्न करने के लिए उपयोग कर सकता हूं ~/distऔर फिर सभी फाइलों को उस उपसर्ग के साथ उपयुक्त निर्देशिका में स्थानांतरित (या कॉपी) कर सकता हूं ?

mkdir ~/dst
find source -name "*.xrt,*.ini,*.moo" -exec mv -i {} -t ~/dst \;

अनिवार्य रूप से, मैं इस तरह की संरचना बनाने के लिए उपरोक्त कमांड (या शायद किसी अन्य कमांड का उपयोग कैसे) को बदल सकता हूं

(उत्पादन)

~/dist/people/people.xrt
~/dist/games/games.xrt
~/dist/games/games.moo
~/dist/games/games.ini
~/dist/monkeys/monkeys.ini
~/dist/monkeys/monkeys.xrt

इस तरह एक निर्देशिका पेड़ से?

(इनपुट)

~/src/xrt/people.xrt
~/src/xrt/games.xrt
~/src/conf/games.ini
~/src/pack/monkeys.xrt
~/src/e344/games.moo
~/src/e344/monkeys.moo
~/src/en-us/monkeys.ini

जवाबों:


10

findइस मामले में क्या करना है यह बताना एक नरक होगा ।

बेहतर शेल का उपयोग करें:

for i in **/*.{xrt,ini,moo}; do
  FILE=$(basename "$i")
  DIR=~/dst/${FILE%.*}
  echo mkdir -p -- "$DIR"
  echo mv -i -t "$DIR" -- "$i"
done

ग्लोब काम shopt -s globstarकरने के लिए उपयोग करें **(या zsh का उपयोग करें!)। और echos को बाद में हटा दें यदि कमांड प्रिंट करता है कि आप क्या चाहते हैं।


बैश का उपयोग करना क्या यह वही है?
— कोडेनिंजा

@codeninja shopt -s globstar, मेरा संपादन देखें। यदि केवल दो स्तर हैं, तो आप उपयोग कर सकते हैं */*.*और स्निपेट किसी भी शेल में काम करेगा।
— गिल्स एसओ- बुराई को रोकें '

2

धोखा मिल कमांड लाइन:

find source -name "*.xrt,*.ini,*.moo" -exec env file={} bash -c 'base="$(basename "$file")";dir="dst/${base%.*}";mkdir -p "$dir";cp "$file" "$dir"' \;

वास्तव में LOL खोजने में बैश स्क्रिप्ट को कॉल करने के लिए चारों ओर एक काम।

= P


1
लगता है कि अगर वहाँ एक फ़ाइल है जो कहा जाता है ... होता है happy rm -rf /! इस तरह का कोड -1 का हकदार है।
— स्टीफन जिमेनेज़

आपका संपादन पर्याप्त नहीं है: मान लीजिए कि आपने एक लिंक पर चिपकाया है और डाउनलोड किया है Yay" rm -rf / "Rox0r.avi, फिर से एक समस्या की तरह है ...
— स्टीफन गिमेनेज़

(और इस तरह के प्रतिस्थापन को सुरक्षित बनाने का कोई तरीका नहीं है)।
— स्टीफन गिमेनेज़

1
आह शायद यह अलग तरीके से करना संभव है। ऐसा लगता है कि निम्नलिखित काम करता है -exec bash -c 'command which uses "$1"' bash '{}' ';':। खैर, यह वैसे भी काफी व्यर्थ है।
— स्टीफन जिमेनेज़

1
@ StéphaneGimenez किया, बैश केवल उपयोग करने वाली चीज नहीं है। LOL
— yuyichao
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.