2017-08-30 1 views
1

Also ich bin ziemlich neu mit bash und Stack Overflow im Allgemeinen, also vergib mir, wenn ich etwas vermisse.Bash: Willst du bestimmte Anzahl von Dateien verschieben, die Leerzeichen in ein anderes Verzeichnis enthält

Ich habe versucht, ein Skript zu erstellen, das eine bestimmte Anzahl von Dateien (z. B. 3 Dateien) verschiebt, die Leerzeichen (wie) in einem anderen Verzeichnis enthalten können.

Ich habe ein paar verschiedene Möglichkeiten ausprobiert, um die Dateien mit Leerzeichen zu bekommen, aber alle haben sich als etwas schwierig erwiesen und schließlich darauf beschränkt, nur *.csv zu verwenden. Zum Beispiel sieht der Code wie (vereinfachte):

for file in *.csv; #grab 3 files 
do 
    echo "$file"; 
    mv "$file" "$TDIR" 
done 

Ich möchte nur eine bestimmte Menge von Dateien verschieben, wie 3. $TDIR in diesem Fall ein Zielverzeichnis zu bewegen, um sie zu.

Ich habe es so gemacht, weil ich in der Lage die gesamten Dateinamen zu greifen "Hello World.txt" statt "Hello" und "World.txt" greifen.

Ich habe versucht, verschiedene Dinge mit wie:

ls -p | grep -v/| head -3 

aber es gibt mir das obige Ergebnis, wo es zwei Dateien erstellt (die Räume verursachen Probleme).

Sorry, es ist irgendwie lang, aber ich habe mit diesem Problem gekämpft und würde jede Hilfe sehr zu schätzen wissen.

+0

Sie sagen, dass Sie eine große Anzahl von Dateien haben, die '* .csv' entsprechen, aber du willst nur ein paar von ihnen bewegen? –

+0

Verwenden Sie 'find (1)', was erlaubt, einen beliebigen Ausdruck für das, was passend sein soll, zu spezifizieren, dann benutzen Sie die '-exec mv {}" $ TDIR "\; Option – o11c

+0

@WilliamPursell Ja, tut mir leid, dass ich nicht sehr detailliert bin. aber ich habe etwa 1000 Dateien in einem Verzeichnis und ich möchte ungefähr alle 10 Minuten ungefähr 100 verschieben. – murther

Antwort

1

Die minimal notwendige Änderung ist die Schleife zu verwenden, die Sie haben, sondern einfach auszubrechen früh:

((count = 3)) 
for file in *.csv ; do 
    echo "$file" 
    mv "$file" "$TDIR" 
    ((count--)) 
    [[ ${count} -eq 0 ]] && break; 
done 

Der einzige wirkliche Potential Nachteil dieser Lösung ist, dass es fehlschlagen, wenn Sie eine wirklich erstaunliche haben Anzahl der Dateien, so viele, dass die Shell Globbing unter der Last zu kämpfen beginnt. Allerdings finde ich es oft einfacher als zu versuchen, die zweiundneunzig find Parameter zu erinnern, die das gleiche Verhalten ermöglichen :-)

+0

Danke für die schnelle Antwort und die Änderungen. Diese Lösung schien bei vielen Dateien noch nicht getestet zu haben, aber ich habe auch ein paar Fragen, hoffe, es macht Ihnen nichts aus zu antworten. Warum haben Sie die Zählvariable in doppelter Klammer und nicht einfach als count = 3? – murther

+0

@murther: weil ich es schön mit Leerzeichen formatiere :-) Ernsthafter, bevorzuge ich dies, da es richtige Ausdrücke wie '((averageCharsPerLine = CharsInFile/LinesInFile))' erlaubt. Technisch wird es in diesem Fall nicht benötigt, aber ich benutze es immer für die Konsistenz. – paxdiablo

+0

Es scheint sauberer zu sein '((--count)) || break' –

Verwandte Themen