Автоматическое переименование имен файлов linux на новые имена файлов, которые допустимы в Windows

Я хотел бы переименовать файл linux в имя файла, допустимое для Windows. Он не должен быть длиннее, чем разрешено, и не должен содержать символов, недопустимых в окнах. Иногда я копирую заголовок из документов в имя файла, и в них есть специальные символы, такие как , ® или ?

Также есть какие-то символы, иногда на концах строк, генерируемых при копировании и вставке заголовка из pdf. Вы можете увидеть их при использовании sed -n 'l':

echo 'Estrogen receptor agonists and estrogen attenuate TNF-α induced
α
apoptosis in VSC4.1 motoneurons.pdf' | sed -n 'l'
Estrogen receptor agonists and estrogen attenuate TNF-\316\261 induce\
d$
\316\261$
apoptosis in VSC4.1 motoneurons.pdf$

or

echo 'A synthetic review of the five molecular Sorlie’s subtypes in
breast cancer' | sed -n 'l' 
A synthetic review of the \357\254\201ve molecular Sorlie\342\200\231\
s subtypes in$
breast cancer$

Я начал сценарий, но он не изящный и неполный. Кто-то уже делал что-то подобное или есть быстрый элегантный способ сделать это?

fn2win="$1"
testFn=$(echo "$fn2win" | sed -n 'l')
#SPEC_CHAR="ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞàáâãäåçèéêëìíîïðñòóôõöøùúûüýþÿ"
#NORM_CHAR="AAAAAACEEEEIIIIDNOOOOOOUUUUYPaaaaaaceeeeiiiionoooooouuuuyby"
#SPEC_LOW_CHAR="aàáâãäåāăąbḃcćçčĉċdḑďḋđeèéěêëēĕęėfḟƒgǵģǧĝğġǥhĥħiìíîĩïīĭįıjĵkḱķǩlĺļľłmṁnńņňñoòóôõöōŏøpṗqrŕŗřsśşšŝṡſtţťṫŧuùúûũüůūŭųvwẁẃŵẅxyỳýŷÿzźžż"
#NORM_LOW_CHAR="aaaaaaaaaabbccccccdddddeeeeeeeeeefffgggggggghhhiiiiiiiiiijjkkkklllllmmnnnnnoooooooooppqrrrrssssssstttttuuuuuuuuuuvwwwwwxyyyyyzzzz"
#SPEC_CAP_CHAR="AÀÁÂÃÄÅĀĂĄBḂCĆÇČĈĊDḐĎḊĐEÈÉĚÊËĒĔĘĖFḞGǴĢǦĜĞĠǤHĤĦIÌÍÎĨÏĪĬĮİJĴKḰĶǨĸLĹĻĽŁMṀNŃŅŇÑOÒÓÔÕÖŌŎØPṖQRŔŖŘSŚŞŠŜṠTŢŤṪŦUÙÚÛŨÜŮŪŬŲVWẀẂŴẄXYỲÝŶŸZŹŽŻ"
#SPEC_CAP_CHAR="AAAAAAAAAABBCCCCCCDDDDDEEEEEEEEEEFFGGGGGGGGHHHIIIIIIIIIIJJKKKKKLLLLLMMNNNNNOOOOOOOOOPPQRRRRSSSSSSTTTTTUUUUUUUUUUVWWWWWXYYYYYZZZZ"
#sed -e "y/'$SPEC_CHAR'/'$NORM_CHAR'/"
if [ "$fn2win" != "$testFn" ]; then
  newLinFn=$(echo "$fn2win" | fromdos | tr "\n" " " |\
     sed -e "
     s/[?()\[\]=+<>:;©®”,*|]/_/g
     s/"$'\t'"/ /g
     s/–/-/g
     s/’/'/g
     s/α/alpha/g
     s/β/beta/g
     s/µ/micro/g
     s/Æ/AE/g
     s/Ǽ/AE/g
     s/æ/ae/g
     s/ǽ/ae/g
     s/DZ/DZ/g
     s/DŽ/DZ/g
     s/Dž/Dz/g
     s/Dz/Dz/g
     s/dz/dz/g
     s/dž/dz/g
     s/ff/ff/g
     s/fi/fi/g
     s/fl/fl/g
     s/ffi/ffi/g
     s/ffl/ffl/g
     s/ſt/ft/g
     s/IJ/IJ/g
     s/ij/ij/g
     s/LJ/LJ/g
     s/Lj/Lj/g
     s/lj/lj/g
     s/NJ/NJ/g
     s/Nj/Nj/g
     s/nj/nj/g
     s/Œ/OE/g
     s/œ/oe/g
     s/ß/SZ/g
     s/\"/_/g
     s/[[:cntrl:]]/_/g
     s/\ $//g
     " |\
   fold -s -w 251 | head -1 | sed 's/\ $/.pdf/')
  if [ "$fn2win" != "$newLinFn" ]; then
      mv "$fn2win" "$newLinFn"
    fi
fi
winFn=$(echo "z:"$newLinFn | sed 's/\//\\/g' )

person D W    schedule 10.12.2010    source источник
comment
Я не думаю, что это не по теме, я не уверен, почему было закрытое голосование за это   -  person D W    schedule 11.12.2010
comment
Кто-то, вероятно, подумал, что объединение нескольких операций sed больше похоже на вопрос использования, чем на программирование. Это спорная позиция.   -  person Chris Stratton    schedule 11.12.2010
comment
Спасибо за объяснение. Я думаю, что это полезная функция. Мне нужно использовать PDF-XChange Viewer для выделения возможностей через вино, и это было бы полезно для этого. Я просматриваю и выделяю сотни статей, как, я уверен, делают другие исследователи, так что кто-то, должно быть, столкнулся с этой проблемой. Где уместно задать этот вопрос?   -  person D W    schedule 11.12.2010
comment
ibm.com/developerworks/linux/library/l-sed3.html кажется полезным для организации команд sed   -  person D W    schedule 11.12.2010
comment
Связано с stackoverflow.com/questions/620605/?   -  person blueberryfields    schedule 11.12.2010
comment
@blueberryfields: это решение специфично для .Net и просто заменяет символы тире.   -  person OliJG    schedule 12.12.2010


Ответы (1)


Похоже, он должен это сделать: http://pwet.fr/man/linux/commandes/konwert

person OliJG    schedule 11.12.2010
comment
Я не уверен, что это сработает для того, что я пытаюсь сделать, похоже, он преобразует кодировки, но я не вижу очевидного преобразования для моей цели. - person D W; 14.12.2010
comment
Преобразование в ascii займет у вас большую часть пути, ограничивая количество жестко закодированных преобразований, которые вам нужно обработать. - person OliJG; 14.12.2010
comment
+1 konwert utf8-ascii полезен и, по крайней мере, избавляет от международных символов и преобразует лигатуры в отдельные символы. konwert utf8-tex также интересен тем, что преобразует греческие символы, такие как α, в \ alpha. - person D W; 15.12.2010