"खोज" फ़ंक्शन लिनक्स में मिली फ़ाइलों की प्रतिलिपि और नाम कैसे बदलें?


17

मेरे पास एक फ़ोल्डर है जिसका नाम /home/user/temps487 फ़ोल्डर है। प्रत्येक फ़ोल्डर में मेरे पास एक फाइल है, जिसे thumb.png कहा जाता है।

मैं एक अलग फ़ोल्डर में thumb.png नाम की सभी फ़ाइलों को कॉपी करना चाहता हूं और वे उस फ़ोल्डर के आधार पर उनका नाम बदल सकते हैं जो वे आए थे।


उनका नाम बदला, कैसे? यदि आप डायरेक्टरी सीमांकक को किसी चीज़ से प्रतिस्थापित करते हैं - मान लें कि अंडरलाइन (_), आपको फ़ाइलों के साथ टकराव हो सकता है, जिसमें पहले से ही एक अंडरलाइन है। यह हर वैध चरित्र के लिए सही है, और बगल में / और 0, जो फ़ाइल नाम में निषिद्ध हैं, कोई सुरक्षित बंदरगाह नहीं है - कोई भी चरित्र टकराव पैदा कर सकता है।
उपयोगकर्ता अज्ञात

क्या फ़ोल्डरों में सबफ़ोल्डर होते हैं, या बस एक सादा, विस्तृत फ़ोल्डरस्ट्रक्चर होता है?
उपयोगकर्ता अज्ञात

जवाबों:


8

हेयर यू गो:

for file in /home/user/temps/*/thumb.png; do new_file=${file/temps/new_folder}; cp "$file" "${new_file/\/thumb/}"; done;

संपादित करें:

वैसे, विहित ज्ञान, यह है कि इसके लिए उपयोग findकरना एक बुरा विचार है - बस शेल विस्तार का उपयोग करना अधिक विश्वसनीय है। इसके अलावा, यह मानता है bash, लेकिन मुझे लगता है कि एक सुरक्षित धारणा है :)

2 संपादित करें:

स्पष्टता के लिए, मैं इसे तोड़ दूंगा:

# shell-expansion to loop specified files
for file in /home/user/temps/*/thumb.png; do

    # replace 'temps' with 'new_folder' in the path
    # '/home/temps/abc/thumb.png' becomes '/home/new_folder/abc/thumb.png'
    new_file=${file/temps/new_folder};

    # drop '/thumb' from the path
    # '/home/new_folder/abc/thumb.png' becomes '/home/new_folder/abc.png'
    cp "$file" "${new_file/\/thumb/}";
done;

${var/Pattern/Replacement}निर्माण पर विवरण यहाँ पाया जा सकता है

cpफ़ाइलनाम में रिक्त स्थान और newlines आदि को संभालने के लिए पंक्ति में उद्धरण महत्वपूर्ण हैं।


new_file = new_folder? स्लैश के सामने बैकस्लैश का उद्देश्य क्या है new_file/\/thumb?
उपयोगकर्ता अज्ञात

1
@user: ${VARIABLE/PATTTERN/REPLACEMENT}के मान का निर्माण करता है VARIABLEलेकिन प्रतिस्थापन पाठ द्वारा पैटर्न की जगह। यहाँ पैटर्न है /thumb( /भागने की ज़रूरत है ताकि यह ऐसा न लगे ${new_file//PATTERN/REPLACEMENT}, जो इसे एक प्रथम-प्रतिस्थापन प्रतिस्थापन के बजाय एक वैश्विक प्रतिस्थापन बनाता है) और प्रतिस्थापन पाठ खाली है।
गाइल्स का SO- बुराई पर रोक

बेशक, अब मैं इसे देखता हूं। :)
उपयोगकर्ता अज्ञात

1
आप मान रहे हैं कि 487 निर्देशिकाएं सीधे अधीन हैं /home/user/temps, जो प्रश्न से स्पष्ट नहीं है। यदि वे नहीं हैं, तो आपको खोजने की जरूरत है या **
गिल्स एसओ- बुराई को रोकना '

@ गिल्स - मैं वास्तव में हूं, इस तरह से मैंने सवाल पढ़ा है। बिंदु की सराहना करते हैं, हालांकि :)
simon

5

यह मनमाने ढंग से गहरी उपनिर्देशिकाओं के लिए काम करता है:

$ find temps/ -name "thumb.png" | while IFS= read -r NAME; do cp -v "$NAME" "separate/${NAME//\//_}"; done
`temps/thumb.png' -> `separate/temps_thumb.png'
`temps/dir3/thumb.png' -> `separate/temps_dir3_thumb.png'
`temps/dir3/dir31/thumb.png' -> `separate/temps_dir3_dir31_thumb.png'
`temps/dir3/dir32/thumb.png' -> `separate/temps_dir3_dir32_thumb.png'
`temps/dir1/thumb.png' -> `separate/temps_dir1_thumb.png'
`temps/dir2/thumb.png' -> `separate/temps_dir2_thumb.png'
`temps/dir2/dir21/thumb.png' -> `separate/temps_dir2_dir21_thumb.png'

इंटरसेस्टिंग भाग पैरामीटर विस्तार है ${NAME//\//_} । यह की सामग्री लेता है NAME, और के /साथ हर घटना की जगह _

नोट: परिणाम कार्य निर्देशिका और खोजने के लिए पथ पैरामीटर पर निर्भर है। मैंने टेम्पों की मूल निर्देशिका से कमांड निष्पादित की। प्रयोग के cpसाथ बदलें echo


फाइलों पर विफल रहता है, जिसमें उनके नाम की एक नई पंक्ति होती है।
उपयोगकर्ता अज्ञात

खैर यह बहुत अच्छा काम किया। एक बात और, मेरे पास कुछ उप निर्देशिकाओं में कुछ ज़िप फाइलें हैं। क्या यह संभव है कि वहां से भी इमेगा निकाला जाए। याद रखें 'ज़िप न टार'
मिरज

1

लघु सहायक कोड:

#!/bin/bash
#
# echo cp "$1" ../tmp/"${1//\//_}" 
#
mv "$1" ../tmp/"${1//\//_}"

चलो इसे 'deslash.sh' नाम दें और इसे निष्पादन योग्य बनाएं। इसके साथ कॉल करें:

find -type f -name thumb.png -exec ./deslash.sh {} ";"    

यह विफल होगा, अगर टक्कर मौजूद है

a/b/thumb.png # and 
a_b/thumb.png 

लेकिन यह अपरिहार्य है।


0

इसे इस्तेमाल करे

mkdir /home/user/thumbs
targDir=/home/user/thumbs

cd /home/user/temps

find . -type d | 
 while IFS="" read -r dir ; do
   if [[ -f "${dir}"/thumb.png ]] ; then
     echo mv -i "${dir}/thumb.png" "${targDir}/${dir}_thumb.png"
   fi
done

संपादित करें

यदि आपके किसी भी डीर के नाम में सफेद-स्पेस के निशान हैं, तो मैंने उन्हें उद्धृत किया है।

इसके अलावा मैंने इसे बदल दिया है इसलिए यह केवल निष्पादित किए जाने वाले आदेशों का प्रिंट आउट लेगा । स्क्रिप्ट के आउटपुट की जांच करना सुनिश्चित करें कि सभी फाइलें / पथ नाम उचित दिखते हैं। जब आप सुनिश्चित करें कि निष्पादित किए जाने वाले आदेशों के साथ कोई समस्या नहीं है, तो निकालें echo


मेरे पास कुछ और सबफ़ोल्डर्स में कुछ पीएनजी फाइलें हैं, क्या वह काम करेगा
मिराज

मेरे "A" -folder के लिए, यह उत्पन्न करता है: mv -i ./A A/thumb.png ../tmp/.png- सभी फाइलें अंत में ../tmp/.png (../tmp मेरा लक्ष्य dir है)।
उपयोगकर्ता अज्ञात

उपरोक्त कोड में सभी चर के आसपास उद्धरण और घुंघराले ब्रेसिज़ जोड़ें, अर्थात "$ {dir}"
शेल्टर

@ मिरर 51 ने लिखा: "कुछ और सबफ़ोल्डर में फाइलें, क्या वह काम करेगा"। हाँ, यह चाहिए। क्या आप जानते हैं कि आप इस स्क्रिप्ट के प्रत्येक चरण को अलग-अलग निष्पादित कर सकते हैं (या जब एक साथ पाइप, प्रत्येक सेट पाइप)। आप बस निष्पादित कर सकते find -type dहैं और आउटपुट देख सकते हैं। क्या वह सभी निर्देशिकाएं जो आप उम्मीद करते हैं? यदि ऐसा नहीं है, तो कृपया समस्या दिखाने के लिए कुछ आउटपुट जोड़ें। शुभ लाभ।
शेल्टर

काम नहीं करेगा। read dirशब्द बंटवारे का प्रदर्शन करता है, और एक निर्देशिका से a\nbए और बी दो उदाहरणों के रूप में लेता है , जिसे कोई भी मास्किंग हल नहीं कर सकता है।
उपयोगकर्ता अज्ञात

-1

कॉपी करने के लिए आपको कमांड cp की आवश्यकता होती है , और linux का नाम बदलना फ़ाइल को हिलाने से समान है, इसलिए आपको इसे mv कमांड के साथ करना होगा । लिनक्स में आपको हमेशा पूरे रास्ते को निर्दिष्ट करना होगा, स्रोत से, यदि आप किसी अन्य फ़ोल्डर में हैं, और गंतव्य फ़ोल्डर में, निश्चित रूप से। मैं कॉपी के लिए कुछ इस तरह से होगा:

cp /source_path/file /destination_path/

या नाम बदलने या स्थानांतरित करने के लिए

mv /source_path/old_file /destination_path/new_name_file

यह पोस्टर के सवाल का केवल एक मामूली हिस्सा है। अब निर्देशिकाओं पर पुनरावृत्ति करने और थंबनेल कॉपी करने की व्याख्या करें :-)

ओपी का उपयोग करना चाहता हैfind

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