Mam dużo plików w folderze o nazwie jak 00802_Bla_Aquarium_XXXXX.jpg
. Teraz muszę skopiować każdy 4th plik do podfolderu, mówiąc w 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
Jak mam to zrobic?
ls
. Zobacz także stackoverflow.com/q/4553751/789593, który pyta o co drugą linię.for n in $(seq -w 20 4 200); do cp "00802_..._00${n}" ...; done
Odpowiedzi:
Zsh możesz zrobić:
POSIXly, ten sam pomysł, tylko trochę bardziej szczegółowy:
Ponieważ te nazwy plików nie zawierają żadnych pustych ani symboli wieloznacznych, możesz także:
źródło
for i do
jest standardem i faktycznie jest bardziej przenośny niżfor i; do
i jest kanonicznym sposobem na zapętlenie parametrów pozycyjnych.W bashu, zabawna możliwość, która zadziała tutaj całkiem dobrze:
To zdecydowanie najkrótsza i najbardziej wydajna odpowiedź: bez podpowłoki, bez pętli, bez potoku, bez
awk
zewnętrznego procesu totem; tylko jeden rozwidlenie docp
(którego i tak nie można uniknąć) i jedno rozszerzenie nawiasów klamrowych i glob (które można całkowicie się pozbyć, ponieważ wiesz, ile plików masz).źródło
cp 00802_Bla_Aquarium_*{03..99..4}.jpg selected
jeśli chcesz3 mod 4
. (Korzystam ze wspaniałego faktu, że 100 można podzielić przez 4). Teraz, w przypadku plików o ciągłym numerowaniu, wszystkie pozostałe odpowiedzi zakładają to samo.Po prostu dzięki bash możesz:
Wzorzec
./*.jpg
zostanie zastąpiony alfabetycznie uporządkowaną listą nazw plików podaną przez bash man, więc powinien pasować do twojego celu.źródło
for
pętli można zastąpić tylko tej linii:(((++n)%4)) || cp "$file" selected/
.;-)
. Problem polega jednak na tym, że tworzyszcp
dla każdego pliku, który nie jest tak naprawdę wydajny.Jeśli
ruby
zainstalowałeś, możesz użyć następującej linijki. Zauważ, że zakłada, że wybrany katalog istnieje.Pobiera listę wszystkich plików z rozszerzeniem .jpg w bieżącym katalogu i dzieli go na listy czterech elementów i kopiuje pierwszy element z każdej takiej listy do katalogu wybranego w bieżącym katalogu.
źródło
Jeśli wiesz, że w nazwach plików nie będzie nowego wiersza, możesz użyć:
źródło
Możesz użyć menedżera plików GUI i zmienić rozmiar obramowania okna, aż co 5 plików zajmie wiersz, a następnie za pomocą myszy wybierz pierwszą kolumnę ...
źródło
Patrząc na stackoverflow.com/q/4553751/789593, który oferuje rozwiązanie do kopiowania co drugi, jak wspomniano w @NN, bardzo prostym rozwiązaniem byłoby:
Może nie być bardzo wydajny, ponieważ wymaga dodatkowego kroku kopiowania, co powinno być bardzo łatwe do zrobienia.
źródło