【问题标题】:Automated renaming of linux filenames to a new filenames that are legal in windows将 linux 文件名自动重命名为 Windows 中合法的新文件名
【发布时间】:2010-12-10 21:21:03
【问题描述】:

我想将一个 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$

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' )

【问题讨论】:

  • 我不认为这是题外话,我不知道为什么会有一个密切的投票
  • 可能有人觉得将一堆 sed 操作串在一起看起来更像是一个使用问题,而不是编程问题。这是一个有争议的立场。
  • 感谢您的解释。我认为这是一个有用的功能。我需要使用 PDF-XChange Viewer 来通过 wine 突出显示功能,这对此很有用。我查看并突出显示了数百篇论文,我确信其他研究人员会这样做,所以一定有人遇到了这个问题。在哪里问这个问题合适?
  • ibm.com/developerworks/linux/library/l-sed3.html 似乎对组织 sed 命令很有用

标签: windows linux filenames


【解决方案1】:

看起来应该这样做:http://pwet.fr/man/linux/commandes/konwert

【讨论】:

  • 我不确定这是否适用于我正在尝试做的事情,它似乎可以转换编码,但我没有看到明显的转换。
  • 转换为 ascii 将带您走大部分路,限制您需要处理的硬编码转换的数量。
  • +1 konwert utf8-ascii 很有帮助,至少可以摆脱国际字符并将连字转换为单独的字符。 konwert utf8-tex 也很有趣,因为它将诸如 α 之类的希腊符号转换为 \alpha。
猜你喜欢
  • 2016-08-01
  • 2021-08-20
  • 2018-06-16
  • 2013-12-13
  • 2020-11-23
  • 1970-01-01
  • 2016-11-14
  • 2023-03-22
  • 2013-04-06
相关资源
最近更新 更多