2013-03-20 5 views
6

Dies ist KEINE Hausaufgabenfrage, das ist eine Frage von einer alten Prüfung, so dass jemand, der eine Antwort gibt, nicht zur akademischen Unehrlichkeit beitragen wird. Für diejenigen, die immer noch skeptisch sind, suche ich einfach, welchen Befehl ich dafür verwenden könnte.Katze eine Datei mehrere Male ohne eine Schleife

Sie haben eine Datei namens one_mb, die genau 1 Megabyte groß ist. Sie möchten daraus eine Datei von genau 128 Megabyte Größe erstellen. Bitte schreiben Sie ein Shell-Skript, um dies mit höchstens 9 Zeilen und ohne Schleifen, if-Anweisungen, Rekursion oder anderen logischen Kontrollstrukturen zu tun. Jeder Befehl einschließlich der Parameter muss weniger als 100 Zeichen lang sein.

Ich fing an, Xarg zu erforschen, konnte aber keinen guten Weg finden, es zu benutzen, um dies zu erreichen.

Antwort

12

Unter der Annahme, bash, Sie kann einen Hack Klammer Erweiterung einzeilige verwenden:

cat one_mb{,}{,}{,}{,}{,}{,}{,} > 128_mb 
+0

Ich denke, es ist wahrscheinlich sicher, Bash anzunehmen, da die Frage ein 'Bash'-Tag hat. Aber, wenn ich das markieren würde, könnte ich gut abheben, weil ich ein schlauer bin :-) Nein, nicht wirklich, guter Hack. – paxdiablo

4

Der große Hinweis hier ist, dass es "nicht mehr als 9 Zeilen" sein kann. Seit 2^7 = 128, müssen Sie nur die Dateigröße 7 mal verdoppeln:

cat one_mb one_mb > two_mb 
cat two_mb two_mb > four_mb 
... 
cat 64_mb 64_mb > 128_mb 
+0

Ich bin, warum sie wurden 9 Befehle gegeben, dann statt 7. Platz für Fehler, denke ich :) – chepner

+1

vielleicht ist es: Zeile 1: Shebang, Zeilen 2-8: der Code oben, Zeile 9: Aufräumen .. (Entfernen der temporären Dateien) – mariux

+0

Dies war die vorherrschende Methode. –

4

Bei 100 Zeichen pro Befehl, könnte man es durchaus ein wenig reduzieren:

cat one_mb one_mb one_mb one_mb one_mb one_mb one_mb one_mb >mb8 
cat mb8 mb8 mb8 mb8 >mb32 
cat mb32 mb32 mb32 mb32 >mb128 
rm -f mb8 mb32 
6

Nicht sicher, ob dies zählt, aber das in den Sinn kam:

seq 1 128 | xargs -Inone cat one_mb >> 128_mb 

Es wurden keine Schleifen verwendet, nur ein Rohr und xargs.

+0

Danke für die Verwendung von xargs, sehe immer noch nicht, wie es funktioniert, aber das ist ein ziemlich süßer oneliner –

+0

Dieser vereinfachte Befehl könnte Ihnen helfen zu verstehen, was ein bisschen besser geht: 'seq 1 10 | xargs -I {} echo Doing {} 'Schauen Sie sich auch die Manpages von xargs an! – Rain

+0

Vielen Dank für die vereinfachte Version. Ich hatte nicht die Absicht, um Klärung zu bitten, ich halte mich an das Gesetz von RTFM, also habe ich die Manpage gelesen, aber mit Beispielen hilft es besser klarzustellen, als eine hohe Beschreibung der Funktionalität. –

2

Dies wird den Dateiinhalt beibehalten und eine Reihe von "Null" -Datensätzen hinzufügen, um es 128 MB zu machen. Haben

ls -ltrh one_mb 

zu prüfen, ob es tatsächlich 128 MB ist, sonst könnte man die „count = 127“ Parameter zu ändern.

-1

Ich denke, es wäre genug mit den Einschränkungen, die Sie haben. Sie können eine Funktion definieren, die eine Ganzzahl als Parameter annimmt. Wenn es größer als 0 ist, cat s die Datei und ruft die gleiche Funktion erneut auf, aber mit dem Parameter verringert.

Dann rufen Sie einfach die Funktion mit dem erforderlichen Wert, und Sie sind fertig.

Good ol‘Rekursion :)

neugierig (Sorry, zu faul für die Codierung, und es gibt viele andere Arbeits Antworten, nur Rekursion vermeiden wollte in Vergessenheit geraten :))

+0

"Bitte schreiben Sie ein Shell-Skript, um dies mit höchstens 9 Zeilen und ** keine ** Schleifen, if-Anweisungen, ** Rekursion ** oder anderen logischen Kontrollstrukturen zu tun." – chepner

+1

Es war __really__ zu spät, ich dachte "wenn Anweisungen, Rekursion, etc" erlaubt waren. Mein Fehler. – mgarciaisaia