Es ist einfach. Ich kann es nicht ausstehen, wenn Leute Leerzeichen beim Benennen von Dateien verwenden. Es zerstört manchmal Konsolenbefehle und macht die Ausgabe von ls hässlich.
Die Herausforderung besteht darin, ein Programm (nur ASCII-Zeichen) zu schreiben, das
- Benennt alle Dateien (einschließlich der Verzeichnisse) im aktuellen Verzeichnis in Versionen um, bei denen Leerzeichen entfernt oder durch "_" ersetzt wurden.
- Bei einer Kollision müssen Sie eine eindeutige Kennung anhängen (ganz nach Ihren Wünschen).
- rekursiv in alle Unterverzeichnisse absteigend
Sie können Pfadnamen im UNIX-Stil annehmen. Wer würde dieses Programm auf einem Windows-Computer benötigen?
Dies ist Codegolf, das kürzeste Programm gewinnt (#ascii Zeichen). Da ich Räume so sehr hasse, muss jeder Raum zweimal gezählt werden.
Bitte geben Sie Ihre Sprache, Partitur, Programm und eine kurze Beschreibung der Ausführung an.
Das Programm muss mit vertretbarem Aufwand auf meinem Linux-Rechner kompiliert und ausgeführt werden.
BEARBEITEN: Da Etan zum Testen eine Dateistruktur angefordert hat, verwende ich das folgende Skript, um einen geeigneten Dateibaum zu erstellen:
#!/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
quelle
Antworten:
Zsh + GNU coreutils - 48 Bytes (1 Leerzeichen)
Es ist seltsam, dass Sie (ASCII-) Leerzeichen hassen, aber Tabulatoren und Zeilenumbrüche in Ordnung sind, aber ich denke, es sind alle Arten von Leerzeichen erforderlich.
zmv löst viele Probleme beim Umbenennen von Dateien in Kürze (und nur geringfügig undeutlich). Es besteht jedoch darauf, dass die Ziele eindeutig sind. Sie können zwar problemlos eindeutige Suffixe hinzufügen, das Hinzufügen eines Suffixes ist jedoch nur dann erforderlich, wenn die gesamte Arbeit wiederholt werden muss. Stattdessen schleife ich manuell und verlasse mich bei Kollisionen auf GNU mv , um einen eindeutigen Bezeichner anzufügen (
--backup
Option, plus,--no-target-directory
wenn ein Ziel ein vorhandenes Verzeichnis ist, da sonstmv
die Quelle in dieses Verzeichnis verschoben würde).(od)
ist ein Glob-Qualifikationsmerkmal zum Sortieren der Ausgabe nach Verzeichnissen, die nach ihrem Inhalt angezeigt werden (wie bei Suchen-depth
).D
Enthält Punktdateien im Glob.:h
und:t
sind History-Modifikatoren ähnlich wiedirname
undbasename
.mv
beschwert sich, dass es aufgerufen wird, um Dateien in sich selbst umzubenennen, da der Glob Dateinamen ohne Leerzeichen enthält. So ist das Leben.Ungolfed-Version:
quelle
zmv
Bomben raus haben vorhermv
die Chance Kollisionen auszusortieren. Ok, ich mache das manuell. Es stellt sich heraus, dass die Länge genau gleich ist, wenn ich Punktedateien überspringe und sogar ein Zeichen speichere, wenn ich dies nicht tue.Bash 116 Bytes, 16 Leerzeichen
Ich habe Fehler nicht unterdrückt, um ein paar Bytes mehr zu gewinnen. Dies wird keine Kollisionen haben.
Wenn nicht posix GNU
find
erwartet werden kann, kann dies weiter verkürzt werden:Bash 110 Bytes, 15 Leerzeichen
Das Entfernen statt Ersetzen von Leerzeichen benötigt zwei Bytes weniger:
Bash 108 Bytes, 15 Leerzeichen
Hinweis: Wenn Tabulatoren anstelle von Leerzeichen verwendet werden können, wird nur 1 Leerzeichen benötigt (das in der Übereinstimmungsregel für die Ersetzung in Zeile 2).
Vielen Dank an Dennis für das Auffinden des Fehlers in Anführungszeichen (und die Bereitstellung der Lösung)
quelle
-depth
in GNU kann durch ersetzt werden-d
, obwohl es sich beschwert, dass es veraltet ist. Ich kenne die Regeln des Golfsports nicht, kann ich das tun?bash -c 'B=${0##*/}...' {} \;
stattdessen verwenden, was tatsächlich kürzer ist.N
Variable los? Es ist nie definiert ...Python 180 Bytes
nur 2 Leerzeichen, wenn Sie die Tabulatortaste zum Einrücken verwenden :-)
quelle
Wenn die Reihenfolge der kollidierten Dateisuffixe der bereits vorhandenen Datei keinen Präzedenzfall geben muss, funktioniert für mich Folgendes:
bash / find / mv 84 Bytes, 16 Leerzeichen
bash / find / mv 82 Bytes, 14 Leerzeichen
Gekuschelt
&&
, um zwei Platzbytes zu sparen.bash / find / mv 60 Bytes, 11 Leerzeichen
Lässt den Fehlerschutz fallen, sodass er Fehler von mv für Dateien erhält, die anfangs keine Leerzeichen enthalten.
Bearbeiten: Löschte die Anführungszeichen aus,
{}
wie von Dennis erinnert. Auch darffind
über Portabilität und Verfall in der kürzesten Version geschrien werden, womv
schon über das Verschieben einer Datei auf sich geschrien wird.Bearbeiten 2:
-T
Zummv
Befehl hinzugefügt , um das Verschachteln von Verzeichnissen zu vermeiden, anstatt sie umzubenennen, wie von pqnet hervorgehoben. Verwendete Klammererweiterung zum Preis von einem Zeichen über nur ein Leerzeichen.quelle
-d
anstelle von verwenden,-depth
und Sie brauchen keine Anführungszeichen{}
.-d
Unterhaltung auf pqnets Antwort, dachte aber, da ich dasmv
Schreien zum Schweigen brachte, würde ich dasfind
Schreien vermeiden . Obwohl ich es wahrscheinlich für den Schreienden kürzen sollte. Und ja, ich zitiere immer{}
aus irgendeinem Grund, obwohl ich weiß, dass Sie das in diesem Fall nicht müssen. Ich schätze, die Macht der Gewohnheit.-T
Option,mv
um dies zu vermeidenNodeJS - 209 Bytes, 3 Whitespaces
quelle
node file.js
TypeError: Object #<Object> has no method 'exists'
. Ratet mal wo: es steht in Zeile 1! : DBash - 86 Bytes
quelle
--backup
mit--b
Bash + Perl
rename
64(
rename
Ist das Perl-Skript auf Debian und Derivaten, nicht der Befehl util-linux.)quelle
*
sollte sein{}
, wie es steht, benennt dies nur Dateien um, deren Name im aktuellen Verzeichnis erscheint. Bei einer Kollision wird kein Suffix angehängt. Sie könnten einiges sparen, indem Sie weglassen,-name "* *"
darename
Dateien, deren Name nicht transformiert wird, unbemerkt ignoriert werden.POSIX
sh
+ GNUfind
+ GNUmv
67 ASCII-Bytes + ein (Literal-) LeerzeichenIch weiß nicht, ob es passt, aber damit wird jede Abfolge von Leerzeichen zu einem einzigen
_
- ich mag es trotzdem. Eigentlich jede Sequenz, außer führende / nachfolgende Leerzeichen - diese werden automatisch abgeschnitten (was auch, wie ich finde, ein nützliches Verhalten ist) . Vielen Dank an Gilles für diesen Hinweis.Hierbei wird nur das interne Feldtrennzeichen zum Trennen von Feldern verwendet.
Es ist ziemlich ... gesprächig ...
...Oh Mann. Ich wusste, dass das Tab-Ding billig war, aber ich fand es zumindest klug. Jetzt bin ich nur zu spät zur Party ...
quelle
IFS
magische Ding nachlesen ...$expand
nicht (ex-pand)) und der eben erwähnten ifsws-Sache funktioniert. Schauen Sie hier-exec
mit-execdir
. Eine weitere BesonderheitIFS
, die Sie nicht erwähnen, ist, dass nachgestellte Leerzeichen gelöscht werden. Beachten Sie, dass Sie, wie andere bemerkt haben, auch diese-T
Option benötigenmv
, wenn das Ziel einesmv
Anrufs ein vorhandenes Verzeichnis ist.sh -c 'mkdir -p ../newtree/"$0"; ln "$0"/* ../newtree/$0 {} \;
vorziehen , mit und anderen Globs in einemfind -type d
Befehl einen gespiegelten Baum von Hardlinks zu erstellen und diese dann zu bearbeiten , aber ich rate nach wie vor, überhaupt einen Code-Golf für eine Bewegungsoperation zu schreiben. Guter Punkt zu den führenden / nachfolgenden Leerzeichen, obwohl ich denke, dass dies auch ein Verhalten ist, das ich bevorzugen würde.zsh
die eingebaute Funktionzmv
.PHP,
147145 Bytes,21 Leerzeichens-> 146rekursive Funktion. Laufen Sie mit
s(".");
glob
Ergebnisse für den angegebenen Pfad durchlaufen :quelle
Rubin 121
quelle
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 Strafpunkte für die Räume.
166, mit Emanueles \ t Trick:
Nur ein einziger Platz in diesem!
quelle
LiveScript - 166
(Ersetzen Sie Leerzeichen durch Tabulatoren.)
Basierend auf nderscore die optimierte Version der CPU1 ‚s Antwort .
quelle
Bash 4+ 111 Bytes
quelle
Groovy, 139 Zeichenlaut @ edc65 Kommentar
Groovig, mit Kollisionen umgehen, 259 Zeichen
quelle
POSIX (Getestet auf zsh) + grundlegende Linux-Befehle 151
quelle
$(ls -CR)
ist völlig falsch. Die-c
Option ist nutzlos und-R
ruft Dateien ohne ihr Verzeichnis ab, was sinnlos ist. Ihre Architektur kann grundsätzlich keine Dateinamen verarbeiten, die Zeilenumbrüche enthalten. Sie benötigenset -f
oder Dateinamen mit Platzhaltern explodieren.export
ist nutzlos. Ich kann vage sehen, was Sie tun, um Dateien zu vereinheitlichen, aber die Weiterleitung ist falsch.