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


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.