पहली x फ़ाइलों को कैसे स्थानांतरित करें


21

मेरे पास यह बहुत बड़ा फोल्डर है जिसमें हजारों unordered फाइलें हैं। क्या mvकमांड के माध्यम से पहले 5000s को सबफ़ोल्डर में स्थानांतरित करना संभव है ? अभी के लिए मैं फ़ाइलों को साथ ले जाता हूं

 mv *some_pattern* ./subfolder1/

अभी के लिए, मैं छवियों को काफी यादृच्छिक रूप से स्थानांतरित करता हूं, यह वास्तव में महत्वपूर्ण नहीं है अगर प्रत्येक सबफ़ोल्डर में बिल्कुल 5000 फाइलें नहीं हैं। इसे करने का कोई बेहतर तरीका है?


जवाबों:


23
mv `ls | head -500` ./subfolder1/

12
(फ़ाइल नाम का यह सोचते हैं कोई भी अंतरिक्ष, टैब, न्यू लाइन, सितारा, खुला वर्ग कोष्ठक, प्रश्न चिह्न वर्ण हो या के साथ शुरू -या .और यह मानते हुए subfolder1ही है कि सूची में दिखाई नहीं देता है।)
स्टीफन Chazelas

@ स्टीफनचेज़लस यदि फ़ाइल में वे हैं, तो हम कमांड को कैसे संशोधित करते हैं?
पीती ली

$ sudo mv `ls | head -50000` 01/ sudo: unable to execute /bin/mv: Argument list too long
ब्रायन थॉमस

15

के साथ zsh:

mv -- *(D.oN[1,5000]) ./subfolder1

5000 नियमित फ़ाइलों को स्थानांतरित करने के लिए वे निर्देशिका में हैं।

लेक्सिकोग्राफ़िक रूप से क्रमबद्ध सूची में पहले 5000 के लिए:

mv -- *(D.[1,5000]) ./subfolder1

यदि आपको अरग सूची के बारे में बहुत लंबी त्रुटि मिलती है । जारी करके आप zshbuitin mvकमांड का उपयोग कर सकते हैं :

zmodload zsh/files

प्रथम।

POSIXly:

set --
for f in .* *; do
  [ "$#" -lt 5000 ] || break
  [ -f "$f" ] || continue
  [ -L "$f" ] && continue
  set -- "$@" "$f"
done
mv -- "$@" subfolder1/

2
POSIX स्निपेट एक रत्न है
इरुवर

क्या होगा अगर मुझे बैश का उपयोग करके त्रुटि मिलती है?
ब्रायन थॉमस

8

एक संस्करण जो सरल है और विशेष वर्ण, रिक्त स्थान आदि का समर्थन करता है।

ls -Q dir1 | head -1000 | xargs -i mv dir1/{} dir2/

इस के लिए के रूप में काम करने के लिए dir2 मौजूद होना चाहिए और आप की मूल निर्देशिका से निष्पादित करने के लिए है dir1और dir2

यह 1000 फ़ाइलों को dir1 से dir2 में ले जाएगा।


अच्छा है! ls -Q -S dir1 | head -1000 | xargs -i mv dir1/{} dir2/
dir1

1
ध्यान दें कि ls -Qआउटपुट आउटपुट xargsअपेक्षित इनपुट प्रारूप के साथ संगत नहीं है । यह अंतरिक्ष वर्णों वाले फ़ाइल नामों के लिए मदद करता है, लेकिन डबल कोट या बैकस्लैश के लिए नहीं और TAB सहित नियंत्रण वर्णों वाले फ़ाइल नामों के लिए हानि पहुँचाता है।
स्टीफन चेज़लस

3

आपको ऐसा कुछ करने की आवश्यकता हो सकती है:

x=1
for file in *
do
    if [ "X$x" = "X#####" ]; then
        break
    fi
    mv $file <destination>
    x=`expr $x + 1`
done

यह स्क्रिप्ट bash, ksh, sh और कई UNIX वेरिएंट में काम करती है।


1
(बशर्ते कि किसी भी फाइलनाम में स्पेस, टैब, न्यूलाइन, स्टार, ओपन स्क्वेयर ब्रैकेट, destination
क्वेश्चन

@ स्टेफेनचैचेलस ट्रू। यह पूरी तरह से समस्या से निपटने का एक तरीका नहीं है।
कार्लसन

3
  1. उस निर्देशिका को प्राप्त करें जिसे आप फ़ाइलों से स्थानांतरित करना चाहते हैं
  2. कमांड के नीचे चलाएं

    find . -name 'Hello*.gz' | head -n 5000 | xargs -I {} mv {} /data01/path/ 

में findआदेश,. (डॉट) वर्तमान निर्देशिका को दर्शाता है

उन फ़ाइलों को खोजता है जो हैलो के साथ शुरू होती हैं और gz के साथ समाप्त होती हैं, पहले 5000 फ़ाइलों को पथ पर ले जाया जाएगा /data01/path/


1

मैं इस तरह mv बैश त्रुटि के बिना सफलतापूर्वक 50,000 की चाल करने में सक्षम था

 ls | head -50000 | xargs -I{} sudo mv {} 01/

काफी मजेदार, यह एक सांबा शेयर पर था, इसलिए 50k की सीमा है क्योंकि विंडोज एक्सप्लोरर जीयूआई सामान्य रूप से एक डायर में 60k से अधिक फ़ाइलों को पसंद नहीं करता है।

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