Mam około 12000 obrazów różnych typów plików, ale każdy z nich został przemianowany na * .jpg.
Teraz chcę przywrócić im odpowiednie rozszerzenia, jak mogę to zrobić
files
file-format
akxer
źródło
źródło
Odpowiedzi:
Możesz to zrobić stosunkowo łatwo w bash:
Jest to ten sam pomysł, co odpowiedź @ AB, ale zamiast tego używa się globów powłoki
find
. Jest${f%%.*}
to nazwa pliku bez rozszerzenia.-0
Zfile
poleceniem czyni go wydrukować\0
po nazwie pliku, który używamy dogrep
typu pliku. Powinno to działać z dowolnymi nazwami plików, w tym zawierającymi spacje, znaki nowej linii lub cokolwiek innego.${type,,}
To podstęp, aby uzyskać niższe rozszerzenia przypadków. PrzekształciłbyPNG
się wpng
.Nie powiedziałeś w swoim pytaniu, ale jeśli potrzebujesz tego, aby być rekurencyjnym i zejść do podkatalogów, możesz użyć tego w zamian:
shopt -s globstar
Pozwoli opcję globstar bash, który pozwala**
podkatalogi meczu:źródło
**
na ponowne przechodzenie do podkatalogów.file
nie zawsze wydaje się, jakie rozszerzenie wydaje się: na przykład zmienia tutaj plik bashfoo.bourne-again
!Poniższego skryptu można użyć do (rekurencyjnej) zmiany nazwy nieprawidłowo ustawionego rozszerzenia
.jpg
na prawidłowe. W przypadku znalezienia nieczytelnego pliku zgłosi go w danych wyjściowych skryptu.Skrypt użyć
imghdr
modułu rozpoznawania następujących typów:rgb
,gif
,pbm
,pgm
,ppm
,tiff
,rast
,xbm
,jpeg
,bmp
,png
. Więcej oimghdr
module tutaj . Lista może zostać rozszerzona o więcej typów, jak wspomniano w linku.W tej chwili zmienia nazwy plików z rozszerzeniem
.jpg
, jak wspomniano w pytaniu. Po niewielkiej zmianie można zmienić nazwę dowolnego rozszerzenia lub określonego zestawu rozszerzeń na prawidłowe (lub bez rozszerzenia, jak tutaj ).Scenariusz:
Jak używać
rename.py
Uruchom go za pomocą polecenia:
źródło
Uwaga: moje podejście wydaje się zbyt skomplikowane. Wolałbym, żeby terdons odpowiedział na twoim miejscu.
Możesz użyć polecenia,
file
aby określić typ pliku:Dzięki tym informacjom można zmienić nazwę plików:
Wykonaj test, zanim zastosujesz polecenie do swoich zdjęć
Przykład
źródło
find -exec bash -c "..."
zrób wszystko, co tam jest, albo użyj,while read -d '' name type
aby podzielić nazwę pliku ifile
dane wyjściowe, a następnie parsuj,$type
aby uzyskać typ pliku. Naprawdę nie warto, zobacz moją odpowiedź, jak to zrobić o wiele łatwiej w czystym (ish) bashu.