Jak dodać rozszerzenia plików na podstawie typu pliku na Linux / Unix?

głosy
12

Jest to pytanie o Unix skryptów powłoki (shell) każdy, ale wszelkie inne „standardowego” rozwiązanie język skryptowy będzie również mile widziane:

Mam katalogu pełnego plików gdzie nazwy plików są wartości hash tak:

fd73d0cf8ee68073dce270cf7e770b97
fec8047a9186fdcc98fdbfc0ea6075ee

Pliki te mają różne oryginalne typy plików, takich jak png, zip, doc, pdf itp

Czy ktoś może dostarczyć skrypt, który będzie zmienić nazwy plików tak się ich odpowiednie rozszerzenie pliku, prawdopodobnie oparty na wyjściu filepolecenia?

Odpowiedź:

JF Sebastiana skrypt będzie działać zarówno dla ouput z nazwami plików, a także rzeczywistej zmiany nazwy.

Utwórz 09/12/2008 o 15:10
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
12

Możesz użyć

file -i filename

aby uzyskać typu MIME. Można potencjalnie odnośnika typ na liście, a następnie dołączyć rozszerzenie. Możesz znaleźć listę typów MIME i rozszerzeniami przykład plików w sieci.

Odpowiedział 09/12/2008 o 15:13
źródło użytkownik

głosy
11

Oto wersja MIMETYPES':

#!/usr/bin/env python
"""It is a `filename -> filename.ext` filter. 

   `ext` is mime-based.

"""
import fileinput
import mimetypes
import os
import sys
from subprocess import Popen, PIPE

if len(sys.argv) > 1 and sys.argv[1] == '--rename':
    do_rename = True
    del sys.argv[1]
else:
    do_rename = False    

for filename in (line.rstrip() for line in fileinput.input()):
    output, _ = Popen(['file', '-bi', filename], stdout=PIPE).communicate()
    mime = output.split(';', 1)[0].lower().strip()
    ext = mimetypes.guess_extension(mime, strict=False)
    if ext is None:
        ext = os.path.extsep + 'undefined'
    filename_ext = filename + ext
    print filename_ext
    if do_rename:
       os.rename(filename, filename_ext)

Przykład:

$ ls * .file? | pyton add-ext.py --rename
avi.file.avi
djvu.file.undefined
doc.file.dot
gif.file.gif
html.file.html
ico.file.obj
jpg.file.jpe
m3u.file.ksh
mp3.file.mp3
mpg.file.m1v
pdf.file.pdf
pdf.file2.pdf
pdf.file3.pdf
png.file.png
tar.bz2.file.undefined

W następstwie odpowiedzi @Phil h za który następuje odpowiedź @csl”:

#!/usr/bin/env python
"""It is a `filename -> filename.ext` filter. 

   `ext` is mime-based.
"""
# Mapping of mime-types to extensions is taken form here:
# http://as3corelib.googlecode.com/svn/trunk/src/com/adobe/net/MimeTypeMap.as
mime2exts_list = [
    ["application/andrew-inset","ez"],
    ["application/atom+xml","atom"],
    ["application/mac-binhex40","hqx"],
    ["application/mac-compactpro","cpt"],
    ["application/mathml+xml","mathml"],
    ["application/msword","doc"],
    ["application/octet-stream","bin","dms","lha","lzh","exe","class","so","dll","dmg"],
    ["application/oda","oda"],
    ["application/ogg","ogg"],
    ["application/pdf","pdf"],
    ["application/postscript","ai","eps","ps"],
    ["application/rdf+xml","rdf"],
    ["application/smil","smi","smil"],
    ["application/srgs","gram"],
    ["application/srgs+xml","grxml"],
    ["application/vnd.adobe.apollo-application-installer-package+zip","air"],
    ["application/vnd.mif","mif"],
    ["application/vnd.mozilla.xul+xml","xul"],
    ["application/vnd.ms-excel","xls"],
    ["application/vnd.ms-powerpoint","ppt"],
    ["application/vnd.rn-realmedia","rm"],
    ["application/vnd.wap.wbxml","wbxml"],
    ["application/vnd.wap.wmlc","wmlc"],
    ["application/vnd.wap.wmlscriptc","wmlsc"],
    ["application/voicexml+xml","vxml"],
    ["application/x-bcpio","bcpio"],
    ["application/x-cdlink","vcd"],
    ["application/x-chess-pgn","pgn"],
    ["application/x-cpio","cpio"],
    ["application/x-csh","csh"],
    ["application/x-director","dcr","dir","dxr"],
    ["application/x-dvi","dvi"],
    ["application/x-futuresplash","spl"],
    ["application/x-gtar","gtar"],
    ["application/x-hdf","hdf"],
    ["application/x-javascript","js"],
    ["application/x-koan","skp","skd","skt","skm"],
    ["application/x-latex","latex"],
    ["application/x-netcdf","nc","cdf"],
    ["application/x-sh","sh"],
    ["application/x-shar","shar"],
    ["application/x-shockwave-flash","swf"],
    ["application/x-stuffit","sit"],
    ["application/x-sv4cpio","sv4cpio"],
    ["application/x-sv4crc","sv4crc"],
    ["application/x-tar","tar"],
    ["application/x-tcl","tcl"],
    ["application/x-tex","tex"],
    ["application/x-texinfo","texinfo","texi"],
    ["application/x-troff","t","tr","roff"],
    ["application/x-troff-man","man"],
    ["application/x-troff-me","me"],
    ["application/x-troff-ms","ms"],
    ["application/x-ustar","ustar"],
    ["application/x-wais-source","src"],
    ["application/xhtml+xml","xhtml","xht"],
    ["application/xml","xml","xsl"],
    ["application/xml-dtd","dtd"],
    ["application/xslt+xml","xslt"],
    ["application/zip","zip"],
    ["audio/basic","au","snd"],
    ["audio/midi","mid","midi","kar"],
    ["audio/mpeg","mp3","mpga","mp2"],
    ["audio/x-aiff","aif","aiff","aifc"],
    ["audio/x-mpegurl","m3u"],
    ["audio/x-pn-realaudio","ram","ra"],
    ["audio/x-wav","wav"],
    ["chemical/x-pdb","pdb"],
    ["chemical/x-xyz","xyz"],
    ["image/bmp","bmp"],
    ["image/cgm","cgm"],
    ["image/gif","gif"],
    ["image/ief","ief"],
    ["image/jpeg","jpg","jpeg","jpe"],
    ["image/png","png"],
    ["image/svg+xml","svg"],
    ["image/tiff","tiff","tif"],
    ["image/vnd.djvu","djvu","djv"],
    ["image/vnd.wap.wbmp","wbmp"],
    ["image/x-cmu-raster","ras"],
    ["image/x-icon","ico"],
    ["image/x-portable-anymap","pnm"],
    ["image/x-portable-bitmap","pbm"],
    ["image/x-portable-graymap","pgm"],
    ["image/x-portable-pixmap","ppm"],
    ["image/x-rgb","rgb"],
    ["image/x-xbitmap","xbm"],
    ["image/x-xpixmap","xpm"],
    ["image/x-xwindowdump","xwd"],
    ["model/iges","igs","iges"],
    ["model/mesh","msh","mesh","silo"],
    ["model/vrml","wrl","vrml"],
    ["text/calendar","ics","ifb"],
    ["text/css","css"],
    ["text/html","html","htm"],
    ["text/plain","txt","asc"],
    ["text/richtext","rtx"],
    ["text/rtf","rtf"],
    ["text/sgml","sgml","sgm"],
    ["text/tab-separated-values","tsv"],
    ["text/vnd.wap.wml","wml"],
    ["text/vnd.wap.wmlscript","wmls"],
    ["text/x-setext","etx"],
    ["video/mpeg","mpg","mpeg","mpe"],
    ["video/quicktime","mov","qt"],
    ["video/vnd.mpegurl","m4u","mxu"],
    ["video/x-flv","flv"],
    ["video/x-msvideo","avi"],
    ["video/x-sgi-movie","movie"],
    ["x-conference/x-cooltalk","ice"]]

#NOTE: take only the first extension
mime2ext = dict(x[:2] for x in mime2exts_list)

if __name__ == '__main__':
    import fileinput, os.path
    from subprocess import Popen, PIPE

    for filename in (line.rstrip() for line in fileinput.input()):
        output, _ = Popen(['file', '-bi', filename], stdout=PIPE).communicate()
        mime = output.split(';', 1)[0].lower().strip()
        print filename + os.path.extsep + mime2ext.get(mime, 'undefined')

Oto urywek dla wersji starego Pythona (nie badane)

#NOTE: take only the first extension
mime2ext = {}
for x in mime2exts_list:
    mime2ext[x[0]] = x[1]

if __name__ == '__main__':
    import os
    import sys

    # this version supports only stdin (part of fileinput.input() functionality)
    lines = sys.stdin.read().split('\n')
    for line in lines:
        filename = line.rstrip()
        output = os.popen('file -bi ' + filename).read()        
        mime = output.split(';')[0].lower().strip()
        try: ext = mime2ext[mime]
        except KeyError:
             ext = 'undefined'
        print filename + '.' + ext

Powinien działać na Python 2.3.5 (chyba).

Odpowiedział 09/12/2008 o 15:47
źródło użytkownik

głosy
7

Następującą odpowiedź CSL za:

Możesz użyć

file -i filename

aby uzyskać typu MIME. można potencjalnie odnośnika typ na liście, a następnie dołączyć rozszerzenie. Możesz znaleźć listę typów MIME i zasugerował rozszerzenia plików w sieci.

Sugeruję napisać skrypt, który zaczyna wyjście file -i filenamei powrót rozszerzenie (rozszczepiony na przestrzeniach, znajdź „/”, zajrzeć do tego terminu w pliku tabeli) w wybranym języku - kilka wierszy w większości. Następnie można zrobić coś takiego:

ls | while read f; do mv "$f" "$f".`file -i "$f" | get_extension.py`; done

w bash, lub rzucać, że w skrypcie bash. Albo zrobić skrypt get_extension większy, ale to sprawia, że ​​mniej przydatnych następnym razem chcesz odpowiednie rozszerzenie.

Edycja: zmiana for f in *do ls | while read fponieważ ten ostatni obsługuje nazwy plików ze spacjami (a zwłaszcza koszmar w systemie Windows).

Odpowiedział 09/12/2008 o 15:33
źródło użytkownik

głosy
2

Oczywiście, należy dodać, że decydując się na typie MIME tylko w oparciu o pliku (1) Wyjście może być bardzo niedokładne / niejasne (co jest „dane”?) Lub nawet całkowicie błędne ...

Odpowiedział 09/12/2008 o 15:51
źródło użytkownik

głosy
0

Zgadzając się z Keltia i opracowanie niektóre jego odpowiedzi:

Dbać - niektóre typy plików mogą być problematyczne. JPEG2000 , na przykład.
I inni mogą powrócić zbyt wiele informacji ze względu na „plik” polecenia bez żadnych tagów opcjonalnych. Sposobem na uniknięcie tego jest użycie pliku „-b” na krótki powrót informacji.

BZT

Odpowiedział 28/02/2010 o 23:40
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more