Ich habe viele Dateien in einem Ordner mit dem Namen 00802_Bla_Aquarium_XXXXX.jpg
. Jetzt muss ich jede vierte Datei in einen Unterordner kopieren und sagen, in selected/
.
00802_Bla_Aquarium_00020.jpg <= this one
00802_Bla_Aquarium_00021.jpg
00802_Bla_Aquarium_00022.jpg
00802_Bla_Aquarium_00023.jpg
00802_Bla_Aquarium_00024.jpg <= this one
00802_Bla_Aquarium_00025.jpg
00802_Bla_Aquarium_00026.jpg
00802_Bla_Aquarium_00027.jpg
00802_Bla_Aquarium_00028.jpg <= this one
00802_Bla_Aquarium_00029.jpg
Wie mache ich das?
ls
. Siehe auch stackoverflow.com/q/4553751/789593, in dem nach jeder zweiten Zeile gefragt wird.for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
Antworten:
Mit zsh können Sie Folgendes tun:
POSIXly, dieselbe Idee, nur etwas ausführlicher:
Da diese Dateinamen keine Leerzeichen oder Platzhalterzeichen enthalten, können Sie auch Folgendes tun:
quelle
for i do
ist Standard und tatsächlich portabler alsfor i; do
und ist die kanonische Methode, um die Positionsparameter zu durchlaufen.In Bash, eine lustige Möglichkeit, die hier ziemlich gut funktioniert:
Das ist definitiv die kürzeste und effizienteste Antwort: keine Unterschale, keine Schleife, keine Leitung, kein
awk
externer Prozess auf der Station; Nur eine Abzweigung zucp
(das können Sie sowieso nicht vermeiden) und eine Bash-Klammer-Erweiterung und Glob (das können Sie insgesamt loswerden, da Sie wissen, wie viele Dateien Sie haben).quelle
cp 00802_Bla_Aquarium_*{03..99..4}.jpg selected
wenn Sie möchten3 mod 4
. (Ich benutze die wunderbare Tatsache, dass 100 durch 4 teilbar ist). Bei fortlaufend nummerierten Dateien gehen alle anderen Antworten von denselben Ergebnissen aus.Mit bash können Sie einfach Folgendes tun:
Das Muster
./*.jpg
wird durch eine alphabetisch sortierte Liste von Dateinamen ersetzt, wie vom Bash-Mann angegeben, sodass es Ihrem Zweck entspricht.quelle
for
Schleife mit nur dieser Zeile ersetzt werden:(((++n)%4)) || cp "$file" selected/
.;-)
. Das Problem ist jedoch, dass Siecp
für jede Datei ein forken, was nicht wirklich effizient ist.Wenn Sie
ruby
installiert haben, können Sie den folgenden Einzeiler verwenden. Beachten Sie, dass davon ausgegangen wird, dass das ausgewählte Verzeichnis vorhanden ist.Es erstellt eine Liste aller Dateien mit der Erweiterung .jpg im aktuellen Verzeichnis, schneidet sie in Listen mit vier Elementen und kopiert das erste Element aus jeder solchen Liste in das im aktuellen Verzeichnis ausgewählte Verzeichnis.
quelle
Wenn Sie wissen, dass Ihre Dateinamen keine Zeilenumbrüche enthalten, können Sie Folgendes verwenden:
quelle
Sie können einen GUI-Dateimanager verwenden und die Größe des Fensterrands ändern, bis alle 5 Dateien eine Zeile belegen. Wählen Sie dann mit der Maus die erste Spalte aus.
quelle
Wenn Sie sich stackoverflow.com/q/4553751/789593 ansehen, das eine Lösung zum Kopieren aller Sekunden bietet, wie von @NN erwähnt, ist dies eine sehr einfache Lösung:
Es ist möglicherweise nicht sehr effizient, da es ein zusätzliches Kopierschrittbit erfordert, das sehr einfach durchzuführen sein sollte.
quelle