Cum să adăugați extensii de fișiere bazate pe tipul de fișier pe Linux / Unix?

voturi
12

Aceasta este o întrebare cu privire la Unix shell scripting (orice shell), dar orice altă soluție de limbaj de scripting „standard“ ar fi apreciat, de asemenea:

Am un director plin de fișiere în cazul în care numele fișierelor sunt valori hash ca aceasta:

fd73d0cf8ee68073dce270cf7e770b97
fec8047a9186fdcc98fdbfc0ea6075ee

Aceste fișiere au diferite tipuri de fișiere originale, cum ar fi png, zip, doc, pdf etc.

Poate cineva oferi un script care să redenumească fișierele astfel încât să aibă extensia lor de fișier corespunzător, probabil , pe baza de ieșire a filecomenzii?

Răspuns:

JF Sebastian script - ul va lucra pentru ambele Ouput a numelor de fișiere , precum și redenumirii actuale.

Întrebat 09/12/2008 la 15:10
sursa de către utilizator
În alte limbi...                            


5 răspunsuri

voturi
12

Poți să folosești

file -i filename

pentru a obține un tip MIME. Ai putea lookup potențial tipul într - o listă și apoi adăugați o extensie. Puteți găsi o listă cu tipurile MIME și extensii de fișier exemplu pe net.

Publicat 09/12/2008 la 15:13
sursa de către utilizator

voturi
11

Iată versiunea Mimetype:

#!/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)

Exemplu:

$ ls * .file? | piton 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

Ca urmare a răspunsului @Phil lui H care urmează răspuns @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')

Iată un fragment pentru versiunile vechi Python (nu a fost testat):

#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

Acesta ar trebui să lucreze la Python 2.3.5 (cred).

Publicat 09/12/2008 la 15:47
sursa de către utilizator

voturi
7

Ca urmare a răspunsului CSLs:

Poți să folosești

file -i filename

pentru a obține un tip MIME. Ai putea lookup potențial tipul într-o listă și apoi adăugați o extensie. Puteți găsi lista cu tipurile MIME și a sugerat extensii de fișiere de pe net.

Aș sugera să scrie un script care ia ieșirea file -i filename, și returnează o extensie (divizat pe spații, găsiți „/“, privi în sus că termenul într - un fișier tabel) în limba dvs. de alegere - câteva linii de cel mult. Apoi , puteți face ceva de genul:

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

în bash, sau arunca că într-un script bash. Sau a face script-ul get_extension mai mare, dar care o face mai puțin util data viitoare când doriți extensia relevantă.

Editare: schimbarea de for f in *la , ls | while read fdeoarece acestea din urmă se ocupă cu spații de nume de fișiere în (un coșmar special pe Windows).

Publicat 09/12/2008 la 15:33
sursa de către utilizator

voturi
2

Desigur, trebuie adăugat că decide cu privire la un tip MIME doar în funcție de fișier (1) de ieșire poate fi foarte inexacte / vagi (ceea ce este „date“?) Sau chiar complet incorecte ...

Publicat 09/12/2008 la 15:51
sursa de către utilizator

voturi
0

Fiind de acord cu Keltia, și elaborarea unora răspunsul său:

Aveți grijă - unele tipuri de fișiere poate fi problematică. JPEG2000 , de exemplu.
Și alții s - ar putea întoarce prea mult info dat „fișierul“ comanda fără nici un tag opțiune. Modul de a evita acest lucru este de a folosi „-B fișier“ pentru o scurtă întoarcere a informațiilor.

BZT

Publicat 28/02/2010 la 23:40
sursa de către utilizator

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