Ich versuche, die letzten 8 Dateien aus den Documents
zu verschieben Verzeichnis in ein anderes Verzeichnis, aber ich möchte sie nicht einzeln in dieses bestimmte Verzeichnis verschieben. Ist es möglich, sie mit einem Ersatz für den tail
zu verschieben Befehl, aber für Verzeichnisse statt Dateien? Ich meine, ich würde das gerne mit etwas wie tail -8 ./Documents | mv ./Anotherdirectory
oder mit mv tail -8 ./Documents ./Anotherdirectory
.
Tatsächlich suche ich nach einer cleveren Möglichkeit, die letzten 8 Dateien (wie in ls
aufgeführt) zu verschieben ) schnell (ohne jeden Namen einzutippen) in das andere Verzeichnis. Irgendwelche Vorschläge?
Akzeptierte Antwort:
Sie können for
verwenden , das die Dateien in einer geordneten Weise durchläuft und es uns ermöglicht, das Analysieren der Ausgabe von find
zu vermeiden oder ls
, um Probleme mit Leerzeichen und anderen Sonderzeichen in Dateinamen zu vermeiden. Vielen Dank an @muru für die Verbesserung 🙂
i=0; j=$(stat ~/Documents/* --printf "%in" | wc -l); for k in ~/Documents/*; do if (( (j - ++i) < 8 )); then echo mv -v "$k" ~/AnotherDirectory; fi; done
Testen Sie es zuerst mit echo
, dann echo
entfernen um die Dateien tatsächlich zu verschieben.
Als Skript:
#!/bin/bash
i=0
j=$(stat ~/Documents/* --printf "%in" | wc -l )
for k in ~/Documents/*; do
if (( (j - ++i) < 8 )); then
echo mv -v -- "$k" ~/AnotherDirectory
fi
done
Entfernen Sie erneut echo
nach dem Testen, um die Dateien wirklich zu verschieben
Erklärung
i=0
der Shell sagen, dass sie bei 0 beginnen sollj=$(stat ~/Documents/* --printf "%in" | wc -l )
dies setzt die Variablej
auf eine Ganzzahl gleich der Gesamtzahl der Dateien im Verzeichnis. Dank Sergs Antwort auf meine eigene Frage, wie man Dateien zuverlässig zählt, egal welche Zeichen ihre Namen enthaltendo if (( (j - ++i) < 8 ))
Testen Sie für jede Iteration der Schleife, ob das Ergebnis vonj
minus die Anzahl der Durchläufe der Schleife ist kleiner als 8 und wenn ja, dannmv -v -- "$k" ~/AnotherDirectory
verschieben Sie die Datei in das neue Verzeichnis