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=0der Shell sagen, dass sie bei 0 beginnen sollj=$(stat ~/Documents/* --printf "%in" | wc -l )dies setzt die Variablejauf 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 vonjminus die Anzahl der Durchläufe der Schleife ist kleiner als 8 und wenn ja, dannmv -v -- "$k" ~/AnotherDirectoryverschieben Sie die Datei in das neue Verzeichnis