2011-07-31 13 views
8

यह स्क्रिप्ट फाइलों को तिथि के अनुसार क्रमबद्ध करेगी और फिर पहली 2500 फ़ाइलों को दूसरी निर्देशिका में ले जाएं।
जब मैं स्क्रिप्ट के नीचे चलाता हूं, तो सिस्टम को तर्कसंगत सूची बहुत लंबी होती है। कोई भी स्क्रिप्ट को बढ़ाने में मेरी मदद कर सकता है? धन्यवादतर्क सूची बहुत लंबी - यूनिक्स

NUM_OF_FILES=2500 
FROM_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in 
DESTINATION_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in_load 

if [ ! -d $DESTINATION_DIRECTORY ] 
     then 
       echo "unused_file directory does not exist!" 
     mkdir $DESTINATION_DIRECTORY 
     echo "$DESTINATION_DIRECTORY directory created!" 
else 
     echo "$DESTINATION_DIRECTORY exist!"  
fi 


echo "Moving $NUM_OF_FILES oldest files to $DESTINATION_DIRECTORY directory" 

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -$NUM_OF_FILES | 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 
+1

आप केवल पहले 2500 फ़ाइलों को स्थानांतरित करने की कोशिश कर रहे हैं? – Sujoy

उत्तर

1

पहले इलाज की जाने वाली फ़ाइलों की बैकअप सूची बनाएं। फिर बैकअप फ़ाइल लाइन-बाय-लाइन पढ़ें और इसे ठीक करें। उदाहरण

#!/bin/bash 
NUM_OF_FILES=2500 
FROM_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in 
DESTINATION_DIRECTORY=/apps/data01/RAID/RC/MD/IN_MSC/ERC/in_load 

if [ ! -d $DESTINATION_DIRECTORY ] 
    then 
      echo "unused_file directory does not exist!" 
    mkdir $DESTINATION_DIRECTORY 
    echo "$DESTINATION_DIRECTORY directory created!" 
    else 
    echo "$DESTINATION_DIRECTORY exist!"  
fi 

echo "Moving $NUM_OF_FILES oldest files to $DESTINATION_DIRECTORY directory" 

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 > list 
exec 3<list 

while read file <&3 
do 
    mv $file $DESTINATION_DIRECTORY 
done 
+0

आपके उत्तर के लिए धन्यवाद, श्रीमान मुझे तुम्हारा मतलब नहीं मिला। मैं यूनिक्स के लिए नया हूँ, ठीक करने के कार्यों क्या है? – user871695

+0

उपयोगकर्ता: मैंने अपना जवाब सही कर दिया है। आपके उत्थान और संतुष्टि के लिए धन्यवाद! – Bytemain

+0

एक ही त्रुटि - तर्क सूची बहुत लंबा संदेश। Fyi $ FROM_DIRECTORY में> 200k फ़ाइलें – user871695

0

एक त्वरित तरीका, इसे ठीक करने के लिए $ FROM_DIRECTORY को बदलने के लिए किया जाएगा, ताकि आप (कम) संबंधित पथ का उपयोग करके फ़ाइलें उल्लेख कर सकते हैं के लिए।

cd $FROM_DIRECTORY && ls -tr MSCERC*.Z|head -2500 |xargs -i sh -c "mv {} $DESTINATION_DIRECTORY"

यह आपको बहुत सारी फ़ाइलें इससे मिलान नहीं करता है, तो भी नहीं पूरी तरह से मूर्ख प्रूफ है।

+0

आपके उत्तर के लिए धन्यवाद, मैं बाद में इसका परीक्षण करूंगा – user871695

+0

एक ही त्रुटि - तर्क सूची बहुत लंबा संदेश। Fyi $ FROM_DIRECTORY में> 200k फ़ाइलें – user871695

3

तुम कहते हो नहीं किया, लेकिन मुझे लगता है यह वह जगह है जहाँ समस्या उत्पन्न होती है: (। आप इसे जोड़ने "-x सेट" अपनी स्क्रिप्ट के शीर्ष करने के द्वारा सत्यापित कर सकते हैं)

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

समस्या यह है कि कर्नेल में एक नई प्रक्रिया के लिए कमांड लाइन की कुल लंबाई का एक निश्चित अधिकतम आकार होता है, और ls कमांड में आपके से अधिक है। आपको इसके चारों ओर ग्लोबिंग और बदले grep का उपयोग कर का उपयोग नहीं कर काम कर सकते हैं:

ls -tr $FROM_DIRECTORY/ | grep '/MSCERC\*\.Z$' |head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

(grep globs के बजाय नियमित अभिव्यक्ति का उपयोग करता है, तो पैटर्न में थोड़ा अलग दिखता है।)

+0

आपके उत्तर देने के लिए धन्यवाद, मैं बाद में इसका परीक्षण करूंगा। – user871695

+0

एक ही त्रुटि - तर्क सूची बहुत लंबा संदेश। Fyi $ FROM_DIRECTORY में> 200k फ़ाइलें हैं। – user871695

+0

यह अजीब है।यदि आप "सेट-एक्स" के साथ चलने से आउटपुट प्रदान कर सकते हैं, तो हम सुनिश्चित हो सकते हैं, लेकिन इस बिंदु पर मेरा सबसे अच्छा अनुमान यह है कि या तो आपने ls कमांड में तारांकन जोड़ा है, या xargs के साथ कुछ गलत है। यदि उत्तरार्द्ध, xargs विकल्पों में add -n10 जोड़ें। –

2

बदलें

ls -tr $FROM_DIRECTORY/MSCERC*.Z|head -2500 | \ 
    xargs -i sh -c "mv {} $DESTINATION_DIRECTORY" 

find "$FROM_DIRECTORY" -maxdepth 1 -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]\n' | sort -k2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs mv -t "$DESTINATION_DIRECTORY" 

इस प्रयोग:

निम्नलिखित की तरह कुछ करना रों संशोधन टाइमस्टैम्प के साथ फ़ाइलों की एक सूची बनाने के लिए मिल जाए, टाइमस्टैम्प द्वारा प्रकार, तो अनावश्यक क्षेत्र head और xargs

संपादित

एक और प्रकार के उत्पादन पार करने से पहले निकाल देता है, गैर जीएनयू utils साथ काम करना चाहिए

find "$FROM_DIRECTORY" -type f -name 'MSCERC*.Z' -printf '%p\t%[email protected]' |sort -k 2,2 -r | cut -f1 | head -$NUM_OF_FILES | xargs -i mv \{\} "$DESTINATION_DIRECTORY" 
+0

आपके उत्तर के लिए धन्यवाद, मैं बाद में इसका परीक्षण करूंगा – user871695

+0

@user: प्रत्येक उत्तर – Hasturkun

+0

को स्वीकार करने के लिए वास्तव में कोई आवश्यकता नहीं है, मैंने आदेश चलाया, यह काम नहीं किया। मैंने स्क्रिप्ट को बदल दिया क्योंकि यह $ FROM_DIRECTORY/-name 'MSCERC * .Z' ढूंढता है। हेड -2500 | xargs -i sh -c "mv {} $ DESTINATION_DIRECTORY"। यह succeffuly फ़ाइलों को destinaton निर्देशिका में स्थानांतरित कर दिया। मेरे प्रश्न यह है कि फाइलों को तिथि के अनुसार कैसे ऑर्डर करें ताकि सिस्टम पहली 2500 फाइलें उठाए? – user871695

संबंधित मुद्दे