To jest proste. Nie mogę znieść, gdy ludzie używają spacji podczas nazywania plików. Czasami psuje polecenia konsoli i powoduje, że wyjście ls jest brzydkie.
Wyzwanie polega na napisaniu programu (tylko znaki ascii), który
- zmienia nazwy wszystkich plików (w tym katalogów) w bieżącym katalogu na wersje ze spacjami usuniętymi lub zastąpionymi przez „_”
- w przypadku kolizji musisz dołączyć unikalny identyfikator (do ciebie)
- schodzi rekurencyjnie do wszystkich podkatalogów
Możesz założyć nazwy ścieżek w stylu UNIX. Kto i tak potrzebowałby tego programu na komputerze z systemem Windows?
To jest kod golfowy, wygrywa najkrótszy program (znaki #ascii). Ponieważ tak bardzo nienawidzę spacji, każde pole musi zostać policzone dwukrotnie.
Podaj swój język, wynik, program i krótki opis tego, jak go uruchomić.
Program musi się skompilować i uruchomić z rozsądnym wysiłkiem na moim komputerze z systemem Linux.
EDYCJA: Ponieważ Etan poprosił o strukturę plików do testowania, oto skrypt, którego obecnie używam do utworzenia odpowiedniego drzewa plików:
#!/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
źródło
Odpowiedzi:
Coreshils Zsh + GNU - 48 bajtów (1 spacja)
To dziwne, że nienawidzisz spacji (ASCII), ale nie masz nic przeciwko tabulatorom i nowym wierszom, ale myślę, że zajmuje to wszystko.
zmv rozwiązuje wiele problemów związanych ze zmianą nazw plików zwięźle (i tylko nieco niejasno). Podkreśla jednak, że cele są wyjątkowe; chociaż możesz łatwo dodawać unikalne sufiksy, dodawanie sufiksu tylko wtedy, gdy byłoby to potrzebne, wymaga ponownego wykonania całej pracy. Zamiast tego zapętlam ręcznie i polegam na GNU mv w celu dołączenia unikalnego identyfikatora w przypadku kolizji (
--backup
opcja, plus--no-target-directory
w przypadku, gdy celem jest istniejący katalog, ponieważ w przeciwnymmv
razie przeniesie źródło do tego katalogu).(od)
jest globalnym kwalifikatorem do sortowania danych wyjściowych z katalogami pojawiającymi się po ich zawartości (np. find's-depth
).D
zawiera pliki kropek w glob.:h
i:t
są modyfikatorami historii podobnymi dodirname
ibasename
.mv
narzeka, że wezwanie do zmiany nazw plików na siebie, ponieważ glob zawiera nazwy plików bez spacji. C'est la vie.Wersja bez golfa:
źródło
zmv
bomby jużmv
mają szansę rozwiązać kolizje. Ok, robię to ręcznie. Okazuje się, że ma dokładnie taką samą długość, jeśli pominę pliki kropkowe, a nawet zapisze znak, jeśli tego nie zrobię.Bash 116 bajtów, 16 spacji
Nie pomijałem błędów, aby uzyskać jeszcze kilka bajtów. To nie spowoduje żadnych kolizji.
Jeśli
find
można oczekiwać GNU niep Posix , można to jeszcze bardziej skrócić:Bash 110 bajtów, 15 spacji
Usuwanie spacji zamiast ich zastępowania powoduje użycie dwóch mniej bajtów:
Bash 108 bajtów, 15 spacji
Uwaga: jeśli zamiast spacji można użyć tabulatorów, potrzebna jest tylko 1 spacja (ta w regule dopasowania do zamiany w linii 2).
Podziękowania dla Dennisa za znalezienie błędu przy podwójnej wycenie (i zapewnienie rozwiązania)
źródło
-depth
w GNU można zastąpić-d
, choć narzeka, że jest przestarzałe. Nie wiem o zasadach gry w golfa, mogę to zrobić?bash -c 'B=${0##*/}...' {} \;
zamiast tego, który w rzeczywistości jest krótszy.N
zmienną? Nigdy nie jest zdefiniowane ...Python 180 bajtów
tylko 2 spacje, jeśli używasz tabulacji do wcięcia :-)
źródło
Jeśli kolejność przyrostków plików kolidujących nie musi dawać precedensu wcześniej istniejącemu plikowi, wówczas dla mnie działa:
bash / find / mv 84 bajtów, 16 spacji
bash / find / mv 82 bajty, 14 spacji
Przytulony,
&&
aby zaoszczędzić dwa bajty miejsca.bash / find / mv 60 bajtów, 11 spacji
Wyłącza ochronę przed błędami, aby uzyskać błędy z mv w plikach, które nie mają spacji na początek.
Edycja: Usunięto cytaty z
{}
przypomnienia Dennisa. Pozwolono takżefind
krzyczeć na temat przenośności i wycofania w najkrótszej wersji, w którejmv
już krzyczy o przeniesieniu pliku na siebie.Edycja 2: Dodano
-T
domv
polecenia, aby uniknąć zagnieżdżania katalogów zamiast zmiany nazwy, jak wskazał pqnet. Użyto rozszerzenia nawiasów klamrowych kosztem jednej postaci, a nie tylko jednego miejsca.źródło
-d
zamiast-depth
i nie potrzebujesz cytatów{}
.-d
rozmowę na odpowiedź pqnet, ale zorientowali odkąd został uciszającmv
krzyki bym uniknąćfind
krzyczeć. Chociaż prawdopodobnie powinienem to skrócić do krzyku. I tak, zawsze cytuję{}
z jakiegoś powodu, chociaż wiem , że nie musisz w tym przypadku. Siła przyzwyczajenia.-T
opcji, abymv
tego uniknąćNodeJS - 209 bajtów, 3 białe znaki
źródło
node file.js
TypeError: Object #<Object> has no method 'exists'
. Zgadnij gdzie: jest w linii 1! : DBash - 86 bajtów
źródło
--backup
do--b
Bash + Perl
rename
64(
rename
jest skryptem Perla dla Debiana i pochodnych, a nie komendą util-linux).źródło
*
powinno być{}
, ponieważ w takim stanie zmienia się tylko pliki, których nazwa pojawia się w bieżącym katalogu. Nie dołącza to przyrostka w przypadku kolizji. Możesz sporo zaoszczędzić, pomijając,-name "* *"
ponieważrename
dyskretnie ignoruje pliki, których nazwa nie została przekształcona.POSIX
sh
+ GNUfind
+ GNUmv
67 bajtów ASCII + jedna (dosłowna) spacjaNie wiem, czy to pasuje, ale z tym każda sekwencja spacji jest łączona w jedną
_
- i tak mi się podoba. Właściwie każda sekwencja, ale spacje wiodące / końcowe, które są - są one automatycznie obcinane (co, jak sądzę, jest również korzystnym zachowaniem) . Dzięki Gillesowi za zwrócenie na to uwagi.To po prostu używa wewnętrznego separatora pól do oddzielenia pól.
Jest dość ... gadatliwy ...
...o stary. Wiedziałem, że zakładka jest tania, ale myślałem, że przynajmniej sprytna. Teraz jestem spóźniony na imprezę ...
źródło
IFS
magicznej rzeczy ...$expand
nie (ex pand)) i na wspomnianej właśnie kwestii ifsws. Spójrz tutaj-exec
z-execdir
. Kolejnym dziwactwem, oIFS
którym nie wspominasz, jest to, że końcowe spacje są usuwane. Zwróć uwagę, że jak zauważyli inni, potrzebujesz również takiej-T
opcjimv
, gdy celemmv
połączenia jest istniejący katalog.sh -c 'mkdir -p ../newtree/"$0"; ln "$0"/* ../newtree/$0 {} \;
i innych globów nafind -type d
komendzie, aby utworzyć lustrzane drzewo linków twardych, a następnie operować na nich, ale domyślam się, że w ogóle piszę golfa kodowego dla operacji przenoszenia. Dobra uwaga na temat wiodących / końcowych spacji, choć myślę, że jest to również zachowanie, które wolałbym.zsh
„s funkcji wbudowanegozmv
na przykład.PHP,
147145 bajtów,21 spacjes-> 146funkcja rekurencyjna. Biegnij z
s(".");
Pętla przez
glob
wyniki dla danej ścieżki:źródło
Ruby 121
źródło
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
Python, 187
165, plus 22 punkty karne za pola.
166, używając sztuczki Emanuele'a :
Tylko jedna przestrzeń w tym!
źródło
LiveScript - 166
(Zastąp spacje tabulatorami.)
Na podstawie nderscore za zoptymalizowanej wersji z CPU1 „s odpowiedź .
źródło
Bash 4+ 111 bajtów
źródło
Groovy, 139 znakówzgodnie z komentarzem @ edc65
Groovy, radzić sobie z kolizjami, 259 znaków
źródło
POSIX (testowany na zsh) + podstawowe komendy Linuksa 151
źródło
$(ls -CR)
jest całkowicie fałszywy. Ta-c
opcja jest bezużyteczna i-R
pozwala uzyskać pliki bez ich katalogu, co jest bezcelowe. Twoja architektura zasadniczo nie obsługuje nazw plików zawierających znaki nowej linii. Potrzebujesz,set -f
bo inaczej nazwy plików zawierające symbole wieloznaczne wybuchną.export
jest bezużyteczny. Mogę niejasno zobaczyć, co próbujesz zrobić, aby ujednolicić pliki, ale orurowanie jest nieprawidłowe.