Ich versuche, die letzten 8 Dateien aus dem Documents
Verzeichnis in ein anderes Verzeichnis zu verschieben, aber ich möchte sie nicht einzeln in dieses bestimmte Verzeichnis verschieben. Ist es möglich, sie mit einem Ersatz des tail
Befehls zu verschieben, jedoch für Verzeichnisse anstelle von Dateien? Ich meine, ich würde das gerne mit so etwas tail -8 ./Documents | mv ./Anotherdirectory
oder so machen mv tail -8 ./Documents ./Anotherdirectory
.
Tatsächlich suche ich nach einer cleveren Möglichkeit, die letzten 8 Dateien (wie in aufgelistet ls
) schnell (ohne jeden Namen einzugeben) in das andere Verzeichnis zu verschieben. Irgendwelche Vorschläge?
mv dir1/* dir2
.ls
?Documents
Verzeichnis verwechselt und nicht gut organisiert sind. So habe ich beispielsweise einCurriculum_Vitae
Verzeichnis imDocuments
Verzeichnis erstellt (dh ./Documents/Curriculum_Vitae) und möchte alle Dateien, die sich auf das Thema beziehen, in dieses Verzeichnis einfügen. Es gibt jedoch viele dieser Dateien, und ich möchte sie nicht einzeln verschieben.Antworten:
Sie können verwenden
for
, wodurch die Dateien in geordneter Weise durchlaufen werden, und wir können das Parsen der Ausgabe vonfind
oderls
vermeiden, um Probleme mit Leerzeichen und anderen Sonderzeichen in Dateinamen zu vermeiden. Vielen Dank an @muru für die Verbesserung :)Testen Sie es zuerst mit
echo
und entfernen Sie es dann,echo
um die Dateien tatsächlich zu verschieben.Als Skript:
Entfernen Sie
echo
nach dem Testen erneut, um die Dateien wirklich zu verschiebenErläuterung
i=0
Weisen Sie die Shell an, bei 0 mit der Iteration zu beginnenj=$(stat ~/Documents/* --printf "%i\n" | wc -l )
Dadurch wird die Variablej
auf eine Ganzzahl gesetzt, die der Gesamtzahl der Dateien im Verzeichnis entspricht. 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 der Häufigkeit, mit der die Schleife ausgeführt wurde, weniger als 8 beträgt, und wenn dies der Fall istmv -v -- "$k" ~/AnotherDirectory
Verschieben Sie die Datei in das neue Verzeichnisquelle
[[ $((j-$((++i)))) -lt 8 ]]
==(( (j - ++i) < 8 ))
<
wird schief gehen, wenn es zehn Dateien oder mehr gibt, weil essorts before
nicht bedeutetless than
und 10 vor 8 sortieren wird.(( ))
ist arithmetischer Kontext.<
vergleicht ganze Zahlen in diesem Zusammenhang, 8 <10.Sie können solche Dinge mithilfe der Befehlssubstitution ausführen. In Bash:
Das
$(command)
führt alles aus, was darin enthalten ist, und ersetzt die Textausgabe durch den äußeren Befehl. Dieserls
Befehl druckt den Pfad zu jeder Datei im Quellverzeichnis, sortiert nach den von Ihnen angegebenen Flags, eines pro Zeile, sodasstail
nur die letzten verwendet werden können. Somit würde sich das Obige auf erweiternSie können einfach ausführen, um
ls -d [sort options] source/* | tail -n8
zu sehen, welche Dateien kopiert werden.Abhängig davon, wie Sie die Ausgabe
ls
und die Dateinamen bestellen , können Sie möglicherweise das tun, wonach Sie suchen, indem Sie einfach eine Variante von verwenden,mv source/name_* destination
um alles, was mit "name_" beginnt, in das Zielverzeichnis zu kopieren.BEARBEITEN: Das Obige wird unterbrochen, wenn die Dateinamen Leerzeichen enthalten. Eine kompliziertere Alternative, die dies anspricht, wäre
Es wird jedoch immer noch die Parsing-
ls
Ausgabe verwendet, um die Sortierung in einer nicht alphabetischen Reihenfolge zu erhalten.quelle
Ähnlich wie bei t-mager können Sie die Sortieroptionen von ls verwenden und die letzten 8 Dateien in eine Liste aufnehmen. Dies sind Ihre Dateien:
1 10 2 3 4 5 6 7 8 9
Verwenden Sie den folgenden Befehl:
for n in `ls|tail -8`; do mv $n ~/temp; done
quelle
ls
viel offensichtlicher ist ...Ich finde, dass das auch funktioniert:
ls -1 [sort options] | tail -n2 | xargs -I {} -n 1 echo "mv \"{}\" ../t2/"
Natürlich muss das Echo entfernt werden:
ls -1 | tail -n2 | xargs -I {} -n 1 mv "{}" ../t2/
Das
"{}"
kann durch'{}'
Tatsächlich ersetzt werden. Als letztes Experiment funktioniert auch das Entfernen der (doppelten) Anführungszeichen. Überraschend, aber getestet.quelle