क्रमांकित फ़ाइलों की एक श्रृंखला ले जाएँ?


14

मुझे 291 नंबर वाली फाइलें (001 से शुरू - शीर्षक और 291 - शीर्षक पर समाप्त) मिली हैं, जिन्हें अलग-अलग निर्देशिकाओं में स्थानांतरित करने की आवश्यकता है। (001 से 021 से फोल्डर 1, 022 से 053 से फोल्डर 2, वे जरूरी नहीं कि हर बार एक ही तरह की फाइलें हों)।

मुझे लगा कि मैं इसे इस तरह से कर सकता हूं: ls | head -n 21 | sed -r 's|(.*)|mv \1 /path/to/folder1|' | sh

मैं लगभग सकारात्मक हूँ एक बेहतर तरीका है, तो यह क्या होगा?

संपादित करें: तो यह ठीक काम किया होगा, लेकिन मुझे याद है ...

मैं एक टर्मिनल का उपयोग करके नहीं अटक रहा हूं, इसलिए मैंने क्लिक करने और खींचने के लिए एक फ़ाइल प्रबंधक का उपयोग किया। हालांकि सवाल अभी भी खड़ा है।


1
आप फ़ोल्डर 1 में 21 सबफ़ोल्डर और फ़ोल्डर 2 में 22 फ़ोल्डर चाहते हैं?
डैनियल बेक

क्या आपने यूनिक्स की समीक्षा की है। इस पर यहाँ एक अच्छा सूत्र है: unix.stackexchange.com/questions/12976/…
chrisjlee

@DanielBeck नहीं, मैं फ़ाइलों को प्रत्येक फ़ोल्डर में ले जाना चाहता हूं। प्रत्येक फ़ोल्डर में अलग-अलग फ़ाइलों की संख्या होती है।
राब

@ ChrisJ.Lee वह जैसा मैं कर रहा हूं / पहले भी वैसा ही है, मुझे यह पसंद है। चूंकि फाइलें अन्य फाइलों को दूसरे फ़ोल्डर में मिलाती हैं, इसलिए मैं ls -l | grep ^- | wc -lलाइनों की संख्या प्राप्त कर सकता हूं ।
राब

1
@ रोब सही। फिर भी, प्रत्येक निर्देशिका में अलग-अलग संख्या में फाइलें। स्वचालित करना (नियमों सहित) कुछ समय के लिए खुद को करने की तुलना में अधिक प्रयास है।
डैनियल बेक

जवाबों:


25

चूंकि आपने कहा था कि फ़ाइलों को मैन्युअल रूप से स्थानांतरित करने की आवश्यकता से यह हमेशा 21 फाइलें नहीं है, और प्रभावी रूप से आप ब्रेस विस्तार का उपयोग कर सकते हैं :

mv filename{001..21} dir1
mv filename{022..53} dir2
...

ऐसा लगता है कि यह काम कर सकता है, मैं इसे आज़माऊंगा।
रोब

1
यह पूरी तरह से काम करता है, अगर आप कोष्ठक के बाद वाइल्डकार्ड जोड़ते हैं। मुझे ठीक इसी की आवश्यकता थी।
राब

2
यदि नंबर नाम के बीच में है, तो आप लिख सकते हैं file{001..21}name, आपको वाइल्डकार्ड का उपयोग करने की आवश्यकता नहीं है। वैसे भी, खुश यह आपके लिए काम किया।
14:20 बजे drrlvn

1

यह आपके द्वारा बताई गई फाइलों को स्थानांतरित कर देगा (सिवाय इसके कि दूसरी श्रेणी दूसरी 21 फाइलों के लिए 022 से 042 होगी)।

for ((i = 1; i <= 291; i++))
do
    ((d = (i - 1) / 21 + 1))
    printf -v file 'filename%03d' "$i"
    printf -v dir  'dirname%02d'  "$d"
    [[ -d "$d" ]] && mkdir "$d"
    mv "$f" "$d"
done

यह हमेशा 21 फाइलें नहीं है, लेकिन धन्यवाद।
राब

0

मेरा मतलब है कि बहुत सारी फ़ाइलों को स्थानांतरित करना है (जैसे कि दस हजार या एक लाख), शेल फ़ाइल सूची के बारे में बहुत लंबी शिकायत करेगा यदि आप सिर्फ {1..20} का उपयोग करते हैं, तो

में zsh , आप लोड कर सकते हैं mv निर्मित:

Extended_glob zmodload सेट करें

zsh / फ़ाइलें

ऐसा करने के बाद, आप कमांड का उपयोग कर सकते हैं:

mv ./somefolder/{1..100000}.txt  pathto/yourfolder/

या यदि आप कुछ शेल स्क्रिप्ट लिख रहे हैं, तो आप कुछ इस तरह से कर सकते हैं:

for i in `seq $start $end`;  
    do  mv "prefix${i}suffix.txt" pathto/yourfolder/  
done

यदि आप zsh का उपयोग नहीं कर रहे हैं, तो आप /unix/128559/solve-mv-argument-list-too-long का संदर्भ ले सकते हैं


हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं। आप किस उत्तर को "अधिक विस्तृत उत्तर" के रूप में संदर्भित कर रहे हैं?
रामहाउंड

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