मैं फ़ाइल नामों में रिक्त स्थान से नफरत करता हूँ


61

यह आसान है। जब लोग फ़ाइलों का नामकरण करते हैं, तो मैं स्थान नहीं ले सकता। यह कभी-कभी कंसोल कमांड को मिटा देता है और एलएस के आउटपुट को बदसूरत बना देता है।

चुनौती एक प्रोग्राम (केवल एससीआई अक्षर) लिखने की है

  1. मौजूदा निर्देशिका में सभी फ़ाइलों (निर्देशिकाओं सहित) को हटाए गए रिक्त स्थान वाले संस्करणों में बदल दिया गया है या '_' द्वारा बदल दिया गया है
  2. टकराने पर, आपको एक विशिष्ट पहचानकर्ता (आप तक) को भेजना होगा
  3. सभी उपनिर्देशिकाओं में पुनरावर्ती रूप से उतरता है

आप UNIX- शैली पथ नामों को मान सकते हैं। विंडोज मशीन वैसे भी इस कार्यक्रम की आवश्यकता किसे होगी?

यह कोड गोल्फ, सबसे छोटा कार्यक्रम जीत (#scii अक्षर) है। चूंकि मैं रिक्त स्थान से बहुत नफरत करता हूं, इसलिए प्रत्येक स्थान को दो बार गिना जाना चाहिए।

कृपया अपनी भाषा, स्कोर, कार्यक्रम और इसे चलाने का संक्षिप्त विवरण प्रदान करें।

कार्यक्रम को मेरे लिनक्स मशीन पर उचित प्रयास के साथ संकलित और निष्पादित करना होगा।

संपादित करें: जैसा कि ईटन ने परीक्षण के लिए एक फ़ाइल संरचना का अनुरोध किया था, यहाँ वह स्क्रिप्ट है जो मैं वर्तमान में एक उपयुक्त फ़ाइल ट्री बनाने के लिए उपयोग करता हूं:

#!/bin/bash
rm -r TestDir

touchfiles()
{
    touch my_file
    touch my__file
    touch "my file"
    touch "my  file"
    touch " my_file  "
}

mkdir TestDir
cd TestDir

touchfiles

for dir in "Test Sub" Test_Sub "Te stSub" Te_stSub
do
    mkdir "$dir"
    cd "$dir"
    touchfiles
    cd ..
done

22
यह आस्की चरस के बिना बने घोल के लिए भीख मांग रहा है।
डेनिस जहरुद्दीन

50
अब मैं
व्हॉट्सएप

10
व्हॉट्सएप में ऐसा करने वाले @BrunoJ को पहले आपको WS में फाइल एक्सेस सिस्टम विकसित करने की आवश्यकता होगी। मुझे लगता है कि वास्तविक चुनौती से ज्यादा चुनौतीपूर्ण होगा।
Nzall

7
किसी को C / C ++ समाधान पोस्ट करने के लिए प्रतीक्षा कर रहा हूं ताकि मैं इसे चुरा सकूं, संकलित करूं, Z86 रिक्त स्थान के साथ x86 मशीन कोड के रूप में हेक्स में पोस्ट करूं! [या शायद बेस ६४]
मार्क के कोवान

10
मैं फ़ाइल नाम में अंडरस्कोर से नफरत करता हूं। डैश का उपयोग करें।
डॉ। रेबमु

जवाबों:


10

Zsh + GNU कोरुटिल्स - 48 बाइट्स (1 स्थान)

for x   (**/*(Dod))mv   -T  --b=t   $x  $x:h/${${x:t}// }

यह अजीब है कि आप (ASCII) रिक्त स्थान से नफरत करते हैं, लेकिन टैब और नईलाइन्स के साथ ठीक हैं, लेकिन मुझे लगता है कि यह सभी प्रकार की है।

zmv फ़ाइल का एक बहुत नाम बदलने की समस्याओं को हल करता है (और केवल थोड़ा अस्पष्ट)। हालांकि, यह लक्ष्य के अद्वितीय होने पर जोर देता है; जब आप आसानी से अद्वितीय प्रत्ययों को जोड़ सकते हैं, तो केवल एक प्रत्यय जोड़ सकते हैं यदि इसकी आवश्यकता होगी तो सभी कामों को फिर से करने की आवश्यकता होती है। इसलिए इसके बजाय मैं मैन्युअल रूप से लूप करता हूं और टक्कर के मामले में एक विशिष्ट पहचानकर्ता को जोड़ने के लिए जीएनयू एमवी पर भरोसा करता हूं ( --backupविकल्प, प्लस --no-target-directoryमामले में एक लक्ष्य एक मौजूदा निर्देशिका है, क्योंकि अन्यथा mvउस निर्देशिका के अंदर स्रोत को स्थानांतरित करेगा)।

(od)एक ग्लोब क्वालीफायर है जो अपनी सामग्री (जैसे खोज -depth) के बाद आने वाली निर्देशिकाओं के साथ आउटपुट को सॉर्ट करने के लिए है । Dग्लोब में डॉट फाइलें शामिल हैं। :hऔर :tकर रहे हैं इतिहास संशोधक के समान dirnameऔर basename

mvशिकायत करता है कि इसे फ़ाइलों का नाम बदलने के लिए स्वयं को बुलाया जाता है, क्योंकि ग्लोब में रिक्त स्थान के बिना फ़ाइल नाम शामिल हैं। C'est la vie।

Ungolfed संस्करण:

for x in **/*\ *(Dod); do
  mv --no-target-directory --backup=numbered $x ${x:h}/${${x:t}// /}
done

1
यह मेरी फ़ाइलों का नाम बिल्कुल भी नहीं बदलता है!
M.Herzkamp

@ M.Herzkamp ओह, ठीक है, zmvबाहर बम पहले mvटकराव को सॉर्ट करने का मौका है। ठीक है, मैं यह मैन्युअल रूप से कर रहा हूं। अगर मैं डॉट फ़ाइलों को छोड़ता हूं और यदि मैं नहीं करता हूं तो भी एक चरित्र को बचाता है, बिल्कुल वैसी ही लंबाई हो जाती है।
गाइल्स

1
अब यह काम कर रहा है। Btw: मैंने ऐसे समय में अंतरिक्ष दंड को शामिल किया था जहाँ मुझे वास्तव में रिक्त स्थान के खिलाफ एक चिंता थी;) विडंबना यह है कि जब मैंने चुनौती पोस्ट की थी, तो मैंने रिक्त स्थान को बाहर नहीं किया था: P
M.Herzkamp

13

बैश 116 बाइट्स, 16 स्थान

find . -depth -exec bash -c 'B=${0##*/}
M="${0%/*}/${B// /_}"
while [ -e "$M" ]
do M=$M.
done
mv "$0" "$M"' {} \;

मैंने कुछ और बाइट्स हासिल करने के लिए त्रुटियों को नहीं दबाया। इससे कोई टकराव नहीं होगा।

यदि गैर-पॉजिक्स जीएनयू की findउम्मीद की जा सकती है, तो इसे और छोटा किया जा सकता है:

बैश 110 बाइट्स, 15 स्थान

find -d -exec bash -c 'B=${0##*/}
M="${0%/*}/${B// /_}"
while [ -e "$M" ]
do M=$M.
done
mv "$0" "$M"' {} \;

उनके स्थान पर रिक्त स्थान हटाने से दो कम बाइट्स का उपयोग होता है:

108 बाइट्स को बैश करें, 15 रिक्त स्थान

find -d -exec bash -c 'B=${0##*/}
M="${0%/*}/${B// }"
while [ -e "$M" ]
do M=$M.
done
mv "$0" "$M"' {} \;

नोट: यदि टैब का उपयोग रिक्त स्थान के बजाय किया जा सकता है, तो केवल 1 स्थान की आवश्यकता है (लाइन 2 में प्रतिस्थापन के लिए मैच नियम में एक)।

दोहरे उद्धरण चिह्नों को खोजने के लिए डेनिस का धन्यवाद (और समाधान प्रदान करना)


11
इस जगह का पता लगाने के लिए मुझे वहाँ मिल जाएगा ??? ;-)
M.Herzkamp

@ M.Herzkamp I हालांकि यह एक कॉपी और पेस्ट त्रुटि थी, लेकिन यह वास्तव में है। लगता है कि मैंने 2 और अंक प्राप्त किए। इसके अलावा, -depthGNU द्वारा प्रतिस्थापित किया जा सकता है -d, हालांकि यह शिकायत करता है कि यह पदावनत है। मैं गोल्फ के नियमों के बारे में नहीं जानता, क्या मैं ऐसा कर सकता हूँ?
pqnet

2
जब तक यह काम करता है, मैं इसकी अनुमति देता हूं। क्या भविष्य के संस्करण में विलोपन हो जाना चाहिए, हालांकि, मुझे इस उत्तर पर वापस आना पड़ सकता है और इसे सही न होने के लिए
अस्वीकृत करना होगा

2
यह ठीक से काम नहीं करेगा अगर किसी भी फ़ाइल नाम में कोई डबल कोट हो। इसे ठीक करने के लिए, आप bash -c 'B=${0##*/}...' {} \;इसके बजाय उपयोग कर सकते हैं , जो वास्तव में छोटा है।
डेनिस

3
मुझे लगता है कि मैं वह आदमी बनूंगा, जो Nपरिवर्तनशील है। इसे कभी भी परिभाषित नहीं किया गया ...
स्टीवन पेनी

9

पायथन 180 बाइट्स

from    os  import*
t,c,h='.',chdir,path
def g(p):
    c(p)
    for x   in  listdir(t):
        if h.isdir(x):g(x)
        n=x.replace(' ','')
        while h.exists(n):n+=t
        if' 'in x:rename(x,n)
    c(t*2)
g(t)

केवल 2 स्थान यदि आप इंडेंटेशन के लिए टैब का उपयोग करते हैं :-)


मुझे लगता है कि अधिकांश अन्य उत्तर रिक्त स्थान के बजाय टैब का उपयोग करके अपने स्कोर में सुधार कर सकते हैं।
कास्परड

लेकिन आपका सबमिशन रिक्त स्थान का उपयोग करता है न? (वर्किंग कोड के लिए +1)
M.erzkamp

मुझे पता नहीं है कि उत्तर में टैब वर्णों को कैसे शामिल किया जाए ...
इमानुएल पौलिनी

2
टैब के साथ प्रतिस्थापित :-)
इमानुएल पौलिनी

3
कितना बदसूरत ... ठीक है, मुझे लगता है मैंने इसके लिए पूछा :(
M.Herzkamp

5

यदि टकराई गई फ़ाइल प्रत्ययों के क्रम को पहले से मौजूद फ़ाइल में मिसाल देने की जरूरत नहीं है तो मेरे लिए निम्नलिखित काम करता है:

बाश / खोजें / एमवी 84 बाइट्स, 16 रिक्त स्थान

find -depth -execdir bash -c '[ "${0//[^ ]}" ] && mv -{T,--b=t} "$0" "${0// }"' {} \;

बैश / ढूँढें / एमवी 82 बाइट्स, 14 रिक्त स्थान

find -depth -execdir bash -c '[ "${0//[^ ]}" ]&&mv -{T,-b=t} "$0" "${0// }"' {} \;

&&दो अंतरिक्ष बाइट्स को बचाने के लिए cuddled ।

बैश / मिल / एमवी 60 बाइट्स, 11 रिक्त स्थान

find -d -execdir bash -c 'mv -{T,-b=t} "$0" "${0// }"' {} \;

त्रुटि सुरक्षा को छोड़ता है, इसलिए इसे फाइलों पर mv से त्रुटियां मिलती हैं जिनके पास शुरू करने के लिए कोई स्थान नहीं है।

संपादित करें: {}डेनिस द्वारा याद दिलाए गए उद्धरणों को छोड़ दिया गया। findपोर्टेबिलिटी और डेप्रिसिएशन के बारे में सबसे कम संस्करण में चीखने की अनुमति दी गई है, जहां mvपहले से ही एक फ़ाइल को अपने ऊपर ले जाने के बारे में चिल्ला रहा है।

संपादित करें 2: pqnet द्वारा बताया गया नाम बदलने के बजाय नेस्टिंग निर्देशिकाओं से बचने के -Tलिए mvकमांड जोड़ा गया । केवल एक स्थान का उपयोग करके एक चरित्र की कीमत पर ब्रेस विस्तार का उपयोग किया।


आप -dइसके स्थान पर उपयोग कर सकते हैं -depthऔर आपको उद्धरण चिह्नों की आवश्यकता नहीं है {}
डेनिस

@ डेनिस हाँ। मैंने -dpqnet के उत्तर पर बातचीत को देखा, लेकिन मुझे लगा कि मैं mvचीखने से बच रहा था, मैं चिल्ला रहा था find। हालांकि मुझे शायद चीखने के लिए इसे छोटा करना चाहिए। और हाँ, मैं हमेशा {}किसी कारण के लिए उद्धृत करता हूं, हालांकि मुझे पता है कि आपके पास इस मामले में नहीं है। मुझे लगता है आदत की ताकत।
एटन रीजनर

1
जब टकराव निर्देशिका नामों पर होता है, तो यह एक को दूसरे में डाल देगा (और स्ट्रिप स्पेस नहीं)। इससे बचने के -Tलिए विकल्प का उपयोग mvकरें
22

यह काम करता है, और मैंने चुनौती में कहा कि परिशिष्ट आपके ऊपर है। +1
M.Herzkamp

4

NodeJS - 209 बाइट्स, 3 व्हाट्सएप

s=require('fs');function a(d){s.readdirSync(d).forEach(function(f){f=d+'/'+f;i=0;r=f;if(/ /.test(f)){r=f.replace(' ','');while(s.existsSync(r))r+=i++;s.renameSync(f,r)}s.statSync(r).isDirectory()&&a(r)})}a('.');

मैं नोड से परिचित नहीं हूँ। मैं इसे कैसे चलाऊंगा?
M.Herzkamp

आपको नोड निष्पादन योग्य नोडज की आवश्यकता होगी ; इसे एक फ़ाइल में सहेजें और चलाएँnode file.js
cPu1

7
मुझे एक अपवाद मिलता है TypeError: Object #<Object> has no method 'exists'। लगता है जहां: यह पंक्ति 1 में है! : D
M.Herzkamp

मैंने इसका परीक्षण किया है। वैसे भी, मैं इसके समकालिक समकक्ष के साथ मौजूद हूं। क्या आप अभी कोशिश कर सकते हैं?
cPu1

1
मेरे पास केवल संस्करण 0.6.12 स्थापित है। वह समस्या हो सकती है।
M.Herzkamp

2

बैश - 86 बाइट्स

find    .   -d|while    IFS=""  read    f;do    t=${f##*/};mv   --b=t   -T  "$f"    "${f%/*}"/${t// /};done

उफ़, एक नज़र होगा
सुबेह

2
इसके अलावा, रिक्त स्थान दो बार गिना जाता है ;-)
M.Herzkamp

आप वास्तव में दो बार गिने जाने वाले स्थानों के साथ क्या मतलब रखते हैं?
सुबेह

1
आप abbreviating के आधार पर पात्रों का एक बहुत बचा सकता है --backupके लिए--b

1
हाँ, अब यह मेरे टेस्ट सेट के साथ भी काम करता है! +1
M.Herzkamp

2

बैश + पर्ल rename64

( renameडेबियन और डेरिवेटिव पर पर्ल स्क्रिप्ट है, न कि उपयोग-लिनेक्स कमांड।)

find . -depth -name "* *" -execdir rename 'y/ /_/' * \;

11
यदि "my file.txt" और "my_file.txt" दोनों मौजूद हों तो क्या होगा?
M.Herzkamp

1
ओह सच .. उस पर जल्द ही काम कर रहा है
जर्मन_गुवाई

1
*यह होना चाहिए {}, क्योंकि यह केवल उन फ़ाइलों का नाम बदलता है जिनका नाम वर्तमान निर्देशिका में प्रकट होता है। यह टकराव के मामले में एक प्रत्यय नहीं जोड़ता है। आप को छोड़ते हुए से काफ़ी बचत हो सकती है -name "* *"के बाद से renameचुपचाप फ़ाइलें जिसका नाम बदल नहीं है पर ध्यान नहीं देता।
गिल्स

2

POSIX sh+ GNU find+ GNU mv67 ASCII बाइट्स + एक (शाब्दिक) स्थान

find    -d  -exec   sh  -cf 'IFS=\ ;IFS=_   set $0;mv   --b=t   "$0"    "$*"'   {}  \;

मुझे नहीं पता कि यह फिट बैठता है, लेकिन इसके साथ रिक्त स्थान के किसी भी अनुक्रम को एक एकल में जोड़ा जाता है _- मुझे वैसे भी यह पसंद है। वास्तव में कोई भी अनुक्रम लेकिन अग्रणी / अनुगामी रिक्त स्थान जो है - वे स्वचालित रूप से काटे जाते हैं (जो कि यह भी है, मुझे लगता है, एक लाभदायक व्यवहार) । यह इंगित करने के लिए गाइल्स का धन्यवाद।

यह सिर्फ आंतरिक फ़ील्ड विभाजक का उपयोग फ़ील्ड को अलग करने के लिए करता है।

यह काफी ... चैटिंग है ...

...ओह यार। मुझे पता था कि टैब चीज सस्ती थी, लेकिन मुझे लगा कि यह कम से कम चालाक है। अब मुझे बस पार्टी की देर है ...


यह मेरे परीक्षण सेट पर काम करता है जैसा कि आपने इरादा किया था, लेकिन चुनौती की आवश्यकता के रूप में नहीं। मुझे यह पसंद है, हालांकि, क्योंकि मैं शायद कुछ नया सीखूंगा। मुझे लगता है कि मुझे इस IFSजादुई
चीज़

1
@ M.Herzkamp - अगर यह व्हाट्सएप पर सेट है या नहीं, इस पर निर्भर करता है। ज्यादातर लोग इससे नफरत करते हैं क्योंकि वे इसके दो प्राथमिक गुणों को नहीं समझते हैं - कि यह केवल विस्तार ( $expandनहीं (पंड)) और ifsws बात पर काम करता है। देखो यहाँ
mikeserv

यह निर्देशिका के अंदर उन फ़ाइलों का नाम नहीं बदलता है जिनके नाम में रिक्त स्थान होते हैं। एक फिक्स के -execसाथ प्रतिस्थापित करना होगा -execdir। Isnother quirk IFSजिसका आप उल्लेख नहीं कर रहे हैं वह यह है कि अनुगामी रिक्त स्थान हटा दिए जाते हैं। ध्यान दें कि जैसा कि दूसरों ने देखा है कि आपको -Tविकल्प की आवश्यकता mvतब है, जब mvकॉल का लक्ष्य एक मौजूदा निर्देशिका है।
गाइल्स

@ गिल्स - मेरी प्राथमिकता हार्डलिंक के दर्पण वाले पेड़ बनाने और फिर उन पर काम करने के लिए कमांड sh -c 'mkdir -p ../newtree/"$0"; ln "$0"/* ../newtree/$0 {} \;पर अन्य ग्लब्स का उपयोग करना होगा find -type d, लेकिन मैं एक चाल ऑपरेशन के लिए एक कोड-गोल्फ लिखने वाला दूसरा अनुमान लगा रहा हूं। अग्रणी / अनुगामी स्थानों के बारे में अच्छी बात है, हालांकि मुझे लगता है कि यह भी एक व्यवहार है जिसे मैं पसंद करूंगा।
mikeserv

@ गिल्स - लेकिन वैसे, यह एक विचित्रता नहीं है - यह एक इरादा और मानक-नियंत्रित व्यवहार है। फील्ड-विभाजन खंड बहुत खोल कल्पना है कि शब्द शामिल नहीं है में कुछ में से एक है अनिर्दिष्ट या कार्यान्वयन से परिभाषित । वहाँ के साथ इस तरह की कोई गारंटी नहीं zshहै builtin समारोह zmv उदाहरण के लिए।
mikeserv

2

PHP, 147 145 बाइट्स, 2 1 स्पेस s -> 146

function    s(){foreach(glob("*")as$n){is_dir($n)&&chdir($n)&s()|chdir("..");if($n<$r=strtr($n," ",_)){while(file_exists($r))$r.=_;rename($n,$r);}}}

पुनरावर्ती कार्य। साथ दौड़ोs(".");

globदिए गए पथ के लिए परिणामों के माध्यम से लूप :

  • अगर निर्देशिका, पुनरावृत्ति
  • अंडरस्कोर के साथ रिक्त स्थान बदलें
  • अगर तार अलग हैं
    • जब नया फ़ाइल नाम लिया जाता है, तो अंडरस्कोर जोड़ें
    • फ़ाइल / निर्देशिका का नाम बदलें

php सर्वर पर फ़ाइलों का नाम बदल देगा ... अब मुझे आश्चर्य है कि जब भी वे आपकी साइट पर आते हैं तो क्लाइंट का फ़ाइल नाम कैसे बदलें: D
M.Herzkamp

1

रूबी 121

require 'find'

Find.find('.') do |file|
  if file.chomp.match(/ /)
    File.rename(file, file.gsub(/ /, '_'))
  end
end

6
कोड गोल्फ में आपका स्वागत है! इन कोड-गोल्फ चुनौतियों में यहां विचार सबसे कम संख्या में वर्णों का उपयोग करना है। इसका मतलब है कि आप निश्चित रूप से रिक्त लाइनों और टैब से छुटकारा पा सकते हैं, और चर नामों को एकल-चरित्र बना सकते हैं, लेकिन लोग वर्ण गणना को कम करने के लिए सभी प्रकार के रचनात्मक तरीकों की तलाश करते हैं।
नहीं कि चार्ल्स

मुझे एक त्रुटि मिली, कि निर्देशिका खाली नहीं है:gam3.rb:5:in `rename': Directory not empty - ./Te stSub or ./Te_stSub (Errno::ENOTEMPTY) from gam3.rb:5 from /usr/lib/ruby/1.8/find.rb:39:in `find' from /usr/lib/ruby/1.8/find.rb:38:in `catch' from /usr/lib/ruby/1.8/find.rb:38:in `find' from gam3.rb:3
M.Herzkamp

1

पायथन, 187

165, रिक्त स्थान के लिए 22 दंड बिंदु।

from os import*
u='_';j=path.join
for t,d,f in walk('.',0):
 for z in f+d:
  n=z.replace(' ',u)
  if n!=z:
   while path.exists(j(t,n)):n+=u
   rename(j(t,z),j(t,n))

166, इमानुएल के \ t चाल का उपयोग कर :

इस एक में केवल एक ही स्थान!

from    os  import*
u='_';j=path.join
for t,d,f   in  walk('.',0):
    for z   in  f+d:
        n=z.replace(' ',u)
        if  n!=z:
            while   path.exists(j(t,n)):n+=u
            rename(j(t,z),j(t,n))

यह मेरे लिए काम करता है। +1
M.Herzkamp

लाइनों की शुरुआत में रिक्त स्थान निकालें और टैब का उपयोग करें - वे कोई स्थान नहीं हैं इसलिए केवल एक बार
गिनें

@ chill0r यही दूसरा संस्करण है; सभी रिक्त स्थान एक को छोड़कर टैब के साथ बदल दिए जाते हैं (एसओ को छोड़कर अभी भी उन्हें रिक्त स्थान के रूप में प्रदर्शित करता है)।
हेनरी कीटर

1

लाइवस्क्रिप्ट - 166

(टैब के साथ रिक्त स्थान बदलें।)

(a=->(s=require \fs)readdirSync(it)map (f)->f=it+'/'+f;r=f.replace /\s/g,i='';(while f!=r&&s.existsSync r=>r+=i++);s.statSync(f)isDirectory(s.renameSync f,r)&&a r) \.

के आधार पर nderscore के अनुकूलित संस्करण की CPU1 के जवाब


काम करता है! +1 इस पोस्ट को साफ करने के लिए मैं पहले अपनी टिप्पणियों को हटाने जा रहा हूं।
M.Herzkamp

0

बैश 4+ 111 बाइट्स

shopt -s dotglob globstar
for f in **
do
n=${f// /}
while [[ $f != $n && -e $n ]]
do n+=1
done
mv "$f" $n
done

1
कई अन्य प्रविष्टियों के रूप में एक ही समस्या: आप मूल निर्देशिका में रिक्त स्थान को बदलते हैं और mv उन्हें नहीं ढूंढ सकते। इसके अलावा, आपको ट्रैवर्सन की दिशा बदलनी चाहिए, अन्यथा आप निर्देशिकाओं का नाम बदल देते हैं और एमवी को फ़ाइलों को अंदर नहीं ढूंढ सकते हैं।
M.Herzkamp

0

ग्रूवी, 139 वर्ण

def c
c={
f->
def g=new File(f.parent,f.name.replaceAll('\\s',''))
f.renameTo(g)
!g.directory ?: g.eachFile(c)
}
new File('.').eachFile(c)

@ edc65 टिप्पणी के अनुसार

ग्रूवी, टकराव से निपटने, 259 वर्ण

def c
c={
p,l,f->
def g=new File(p,f.name.replaceAll('\\s',''))
f==g?:
(g.exists()?f.renameTo(g.toString()+l.indexOf(f.name)):f.renameTo(g))
!g.directory?:g.eachFile(c.curry(g,g.list().toList()))
}
def r=new File('.')
r.eachFile(c.curry(r,r.list().toList()))

1
इससे टकराव नहीं होता है।
edc65

सुनिश्चित करें कि उनके माता-पिता निर्देशिकाओं से पहले फ़ाइलों का नाम बदल दिया गया है, और मूल निर्देशिकाओं में स्थान नहीं बदले गए हैं।
M.Herzkamp

मुझे यकीन है कि यह ठीक है
लॉगिन करें

0

POSIX (zsh पर परीक्षण) + बुनियादी लिनक्स कमांड 151

export IFS='
'
for f in $(ls -R1);do export n=$(echo $f|tr ' ' '_');yes n|mv $f $n || yes n|mv $f `echo $n;echo $f|md5sum`
done

@ M.Herzkamp फिक्स्ड।
LinGeek

कई चीजें: ls -cR में निर्यात IFS और c का क्या कार्य है? और mv के किस संस्करण के लिए आपको --reply विकल्प की आवश्यकता है? (मेरे पास 8.13 है, और यह विकल्प को नहीं पहचानता है)। एक बेहतर स्कोर पाने के लिए, आपको अपने चर नामों को संक्षिप्त करना चाहिए।
एम। हर्जकम्प

सी नए स्थान के साथ रिक्त स्थान की जगह लेती है। IFS रिक्त स्थान को विभाजक बनाता है। --Reply पुराने संस्करणों से है और इसे ठीक किया जाना है।
LinGeek

1
क्या आप पंक्ति 5 में दूसरा mv याद कर रहे हैं? और मुझे लगता है कि उस पंक्ति में एक गूंज गलत है।
M.Herzkamp 20

1
$(ls -CR)पूरी तरह से फर्जी है। -cविकल्प बेकार है, और -Rअपनी निर्देशिका है, जो व्यर्थ है बिना आप फ़ाइलों को हो जाता है। आपका आर्किटेक्चर मूल रूप से नए नामों वाली फ़ाइल नामों को संभाल नहीं पाएगा। आपको जरूरत है set -fवरना वाइल्डकार्ड्स वाले फ़ाइल नाम विस्फोट हो जाएंगे। exportव्यर्थ का। मैं अस्पष्ट रूप से देख सकता हूं कि आप फ़ाइलों को विशिष्ट बनाने के लिए क्या करने की कोशिश कर रहे हैं, लेकिन पाइपिंग गलत है।
गाइल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.