Chcę zmienić nazwę plików w katalogu na kolejne numery. Na podstawie daty utworzenia plików.
Na przykład sadf.jpg
do 0001.jpg
, wrjr3.jpg
do 0002.jpg
itd. Liczby wiodących zer w zależności od całkowitej liczby plików (nie trzeba dodatkowych zer, jeśli nie są potrzebne).
bash
rename
batch-rename
Gnutt
źródło
źródło
Odpowiedzi:
Spróbuj użyć pętli
let
, aprintf
do wypełnienia:użycie
-i
flagi zapobiega automatycznemu nadpisywaniu istniejących plików.źródło
printf -v new "%04d.jpg" ${a}
aby wstawić wartość do zmiennej. I((a++))
działa na zwiększenie wartości zmiennej. Nie robi to również w kolejności dat utworzenia ani nie minimalizuje wypełnienia, które są określone przez OP. Należy jednak zauważyć, że Linux / Unix nie przechowuje daty utworzenia.mv -- "$i" "$new"
poprawnie obsługiwać źródłowe nazwy plików rozpoczynające się od myślników; w tej chwilimv
spróbuje parsować takie nazwy plików, jak zbiory flag.-i
powinien zostać uwzględniony w odpowiedzi, a notatka powinna zostać odpowiednio przepisana. to będzie bardziej bezpieczne. :(Piękno w jednej linii:
Można zmienić
.ext
z.png
,.jpg
itpźródło
ls | cat -n | while read n f; do mv "$f" `printf "%04d.extension" $n`; done
aby mieć zerowane liczby-n
do komendy mv, aby zapobiec przypadkowemu nadpisaniu plików. Odkryłem to na własnej skórze!ls -1prt | grep -v "/$" | cat -n | while read n f; do mv -n "${f}" "$(printf "%04d" $n).${f#*.}"; done
Wyniki: (1) posortowane w kolejności modyfikacji, późniejsze pliki z późniejszymi indeksami; (2) ignoruje katalogi - i nie rekurencyjne; (3) indeksy padów; (4) zachowuje oryginalne rozszerzenie.Podoba mi się rozwiązanie gauteh ze względu na jego prostotę, ale ma ono istotną wadę. Podczas uruchamiania na tysiącach plików możesz otrzymać komunikat „lista argumentów za długa” ( więcej na ten temat ), a po drugie, skrypt może działać naprawdę wolno. W moim przypadku, uruchamiając go na około 36 000 plików, skrypt przeniósł się o ok. jeden przedmiot na sekundę! Nie jestem do końca pewien, dlaczego tak się dzieje, ale zasada, którą otrzymałem od kolegów, brzmiała: „
find
jest twoim przyjacielem” .Aby policzyć przedmioty i zbudować polecenie, gawk użyto . Zwróć jednak uwagę na główną różnicę. Domyślnie
find
wyszukuje pliki w bieżącym katalogu i jego podkatalogach, więc w razie potrzeby ogranicz wyszukiwanie tylko w bieżącym katalogu (użyj,man find
aby zobaczyć, jak to zrobić).źródło
NR
dla krótszego polecenia.gawk '{ printf "mv %s %04d.jpg\n", $0, NR }'
$(rm -rf /).jpg
.for
Pętla nie trwa 1 sekundę na plik, ściśle mówiąc. Pobieranie 36 000 nazw plików z systemu plików zajmuje dużo czasu, a następnie dość szybkie zapętlenie. Wiele systemów plików ma problemy z dużymi katalogami, niezależnie od tego, jakie dokładne polecenia uruchamiasz; ale zwyklefind
będzie szybszy niż znak wieloznaczny powłoki, ponieważ musi pobrać i posortować listę pasujących plików.za pomocą polecenia „zmień nazwę”
lub
źródło
rename
(Linux Mint 13) nie ma-N
opcji.rename
polecenie, ale nigdy nie wiedziałem-N
! Dzięki!rename
. Link opublikowany przez @Bostrot to kolejne narzędzie do zmiany nazwy i wygląda na to, że @RomanRhrnNesterov tego użył. Do wszystkich użytkownikówrename
Peder Stray i Larry Wall (pakietperl-rename
na arch Linux i pakietrename
na debian / ubuntu): Możesz zdefiniować$N
siebie:perl-rename '$N=sprintf("%04d",++$N); s/.*/$N.jpg/' *.jpg
korzystanie z rozwiązania Pero w OSX wymagało pewnych modyfikacji. Użyłem:
Uwaga: ukośniki odwrotne służą do kontynuacji linii
edytuj 20 lipca 2015 r .: uwzględniono opinię @ klaustopher, aby zacytować
\"%s\"
argumentmv
polecenia w celu obsługi nazw plików ze spacjami.źródło
$(rm -rf /).jpg
.mv
. Jeśli masz plik o nazwie tzn.some thing.jpg
Skrypt nie działa. Właśnie tego użyłem:find . -name '*.jpg' | awk 'BEGIN{ a=0 }{ printf "mv \"%s"\ wallpaper-%04d.jpg\n", $0, a++ }' | bash
-maxdepth 1
użyłbym do pracy tylko na plikach JPG w bieżącym katalogu, ponieważ lepiej być bezpiecznym niż żałować.ls -1 *.jpg
zamiast znaleźć, inaczej nie zostanie posortowane. Lub dodaj|sort|
przed awkBardzo prosty bash one liner, który zachowuje oryginalne rozszerzenia, dodaje zera na początku, a także działa w OSX:
Uproszczona wersja http://ubuntuforums.org/showthread.php?t=1355021
źródło
9.ext
wcześniej11.ext
, ale inne narzędzia (jakls
) też tego nie zrobią.Aby pracować we wszystkich sytuacjach, umieść \ "dla plików, które mają miejsce w nazwie
źródło
$(rm -rf /)
są nadal honorowane.Jeśli
rename
nie obsługuje-N
, możesz zrobić coś takiego:Edycja Aby rozpocząć od podanego numeru, możesz użyć (nieco brzydko wyglądającego) kodu poniżej, po prostu zamień 123 na żądany numer:
Lista plików jest uporządkowana według czasu utworzenia (najpierw najnowsze, dodaj
-r
do ls, aby odwrócić sortowanie), a następnie wysyła tę listę plików do zmiany nazwy. Zmień nazwę używa kodu perla w wyrażeniu regularnym do formatowania i zwiększania licznika.Jeśli jednak masz do czynienia z obrazami JPEG z informacjami EXIF, polecam
exiftool
To z dokumentacją exiftool pod „Zmiana nazwy przykładach”
źródło
rename
?W OSX zainstaluj skrypt zmiany nazwy z Homebrew:
Następnie możesz to zrobić naprawdę śmiesznie łatwo:
Lub dodać ładny prefiks:
źródło
Global symbol "$N" requires explicit package name (did you forget to declare "my $N"?) at (user-supplied code).
Postępuj zgodnie z poleceniem zmień nazwę wszystkich plików na sekwencję, a także rozszerz małe litery:
źródło
Z tego powodu miałem podobny problem i napisałem skrypt powłoki. Postanowiłem opublikować, niezależnie od tego, że opublikowano już wiele dobrych odpowiedzi, ponieważ uważam, że może to być pomocne dla kogoś. Możesz to poprawić!
numerować
@Gnutt Żądane zachowanie można osiągnąć, wpisując następujące polecenie:
Jeśli opcja
-r
zostanie pominięta, rozwiercanie będzie tylko symulowane (powinno być pomocne podczas testowania).Opcja L opisuje długość numeru docelowego (który będzie wypełniony zerami wiodącymi) można również dodać prefiks / sufiks z opcjami
-p <prefix>
-s <suffix>
.Jeśli ktoś chce, aby pliki zostały posortowane numerycznie przed ich ponumerowaniem, po prostu usuń
-o modtime
opcję.źródło
źródło
Załóżmy, że mamy te pliki w katalogu, uporządkowanym według kolejności tworzenia, z których pierwszy jest najstarszy:
następnie
ls -1cr
wypisuje dokładnie powyższą listę. Następnie możesz użyćrename
:które wyjścia
Ostrzeżenie „użycie niezainicjowanej wartości […]” jest wyświetlane dla plików bez rozszerzenia; możesz to zignorować.
Usuń
-n
zrename
polecenia, aby faktycznie zastosować zmianę nazwy.Ta odpowiedź jest inspirowana odpowiedzią Łukasza z kwietnia 2014 r . Ignoruje wymóg Gnutta, aby ustawić liczbę wiodących zer w zależności od całkowitej liczby plików.
źródło
ls -1tU
na czas tworzenia. Musiał takżerename
zainstalować, czego nie miałem.Ponownie używam rozwiązania Pero z niewielkimi modyfikacjami, ponieważ
find
będzie przechodzić drzewo katalogów w kolejności, w której pozycje są przechowywane w pozycjach katalogu. Będzie to (przeważnie) spójne od uruchomienia do uruchomienia na tym samym komputerze i będzie zasadniczo „kolejnością tworzenia plików / katalogów”, jeśli nie zostaną usunięte.Jednak w niektórych przypadkach musisz uzyskać logiczną kolejność, powiedzmy według nazwy, która jest używana w tym przykładzie.
źródło
blahblah; rm -r * blahblah.jpg
?Posortowane według czasu, ograniczone do jpg, zer wiodących i nazwy basename (na wypadek, gdybyś chciał):
(wszystko w jednej linii, bez
\
)źródło
ls
skrypt.rename -vn - usuwa n, aby wyłączyć tryb testowy
{$ i = 1;} - numer startowy kontroli
„% 04d.jpg” - licznik zera zero 04 i ustaw rozszerzenie wyjściowe .jpg
źródło
rename -v -n 's/../our $i;if(!$i){$i=1;} sprintf("%02d", $i++)/e' *
Dla mnie ta kombinacja odpowiedzi działała idealnie:
ls -v
pomaga w prawidłowym zamówieniu 1 10 9: 1 9 10, unikając problemów z rozszerzaniem nazw plików w JPG JPG JPEGgawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }'
przenumeruje 4 znaki i wiodące zera. Unikając mv, nie próbuję przypadkowo zastąpić niczego, co już istnieje, przypadkowo mając ten sam numer.bash
wykonujePamiętaj, co powiedział @xhienne, przesyłanie nieznanych treści do basha stanowi zagrożenie bezpieczeństwa. Ale tak nie było, ponieważ korzystałem z zeskanowanych zdjęć.
źródło
Możesz także użyć ls
źródło
blahblah; rm -r * blahblah.JPG
?Większość innych rozwiązań zastąpi istniejące pliki, które zostały już nazwane liczbą. Jest to szczególnie problem podczas uruchamiania skryptu, dodawania kolejnych plików, a następnie ponownego uruchamiania skryptu.
Ten skrypt najpierw zmienia nazwy istniejących plików numerycznych:
źródło
Ten oneliner wyświetla listę wszystkich plików w bieżącym katalogu, sortuje według znacznika czasu utworzenia w odwrotnej kolejności (oznacza, że najstarszy plik znajduje się na początku) i zmienia automatycznie nazwy z końcowymi zerami, zgodnie z ilością plików. Rozszerzenie pliku zostanie zachowane.
Zwykle od lat mam tylko jeden folder na zdjęcia i filmy z telefonów komórkowych. Po zastosowaniu tego polecenia moje zdjęcia i filmy są gotowe do pokazu slajdów we właściwej kolejności na telewizorze lub do archiwizacji.
Pamiętaj, że jeśli masz kolizje nazw plików, tracisz pliki. Więc najpierw zmień nazwę na coś dziwnego,
temp001.jpg
a następnie uruchom na ostateczną nazwę pliku.źródło
ls
Lepiej unikać biegania nie raz, ale dwa razy tak, ale nie badałem go dogłębnie.ls
, dlatego właśnie dwa z nich są wymagane. 3. Takie polecenia są jednorazowe i nie powinny być uwzględniane w skryptach, dlatego istnieje powód, dla którego ludzie wolą liniówkiOto, co zadziałało dla mnie.
Użyłem polecenia zmiany nazwy, więc jeśli jakikolwiek plik zawiera spacje w nazwie, mv komenda nie myli się między spacjami a rzeczywistym plikiem.
źródło
Obecnie istnieje opcja po wybraniu wielu plików do zmiany nazwy (widziałem w menedżerze plików Thunar).
Monit zawiera wszystkie pliki w tym konkretnym katalogu, wystarczy sprawdzić w sekcji kategorii
źródło
Ten skrypt posortuje pliki według daty utworzenia w systemie Mac OS bash. Używam go do masowej zmiany nazw filmów. Wystarczy zmienić rozszerzenie i pierwszą część nazwy.
źródło
blahblah; rm -r * blahblah.mp4
?Oto inne rozwiązanie z poleceniem „zmień nazwę”:
źródło
rename 's/(\d+)/sprintf("%04d",$1)+1/ge'
Odpowiedź Pero mnie tu zaprowadziła :)
Chciałem zmienić nazwę plików w stosunku do czasu, ponieważ przeglądarki nie wyświetlały obrazów w kolejności czasowej.
źródło
blahblah; rm -r * blahblah.jpg
? Tylko ekstremalny przykład.Jeśli używasz Annotatora obrazu do etykietowania obrazów.
$ make qt5py3
$ python3 labelImg.py
źródło
Aby zmienić numerację 6000 plików w jednym folderze, możesz użyć opcji „Zmień nazwę” programu ACDsee.
Aby zdefiniować prefiks, użyj tego formatu:
####"*"
Następnie ustaw numer początkowy i naciśnij Zmień nazwę, a program zmieni nazwę wszystkich 6000 plików na kolejne numery.
źródło