![如何使用每个文件的内容为大量文件添加扩展名?](https://linux22.com/image/1330066/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E6%AF%8F%E4%B8%AA%E6%96%87%E4%BB%B6%E7%9A%84%E5%86%85%E5%AE%B9%E4%B8%BA%E5%A4%A7%E9%87%8F%E6%96%87%E4%BB%B6%E6%B7%BB%E5%8A%A0%E6%89%A9%E5%B1%95%E5%90%8D%EF%BC%9F.png)
我有超过 10,000 个文件没有旧版 Mac OS 的扩展名。它们在文件结构中嵌套得非常紧密,并且还包含各种奇怪的格式和字符。它们不再具有文件类型或创建者代码。许多此类文件中都有文本,可让我确定扩展名(例如,Word.Document.8 存在于该版本 Word 创建的每个文件的文本中)。
我发现一个脚本看起来可以一次处理其中一种文件类型,但它会删除文件名中恶意字符后的部分,这并不好。
find . -type f -not -name "*.*" -print0 |\
xargs -0 file |\
grep 'Word.Document.8' |\
sed 's/:.*//' |\
xargs -I % echo mv % %.doc
我应该先清理文件名中的字符,还是以编程方式处理脚本中的字符以保持它们不变?只要我不丢失文件名中的信息,我认为清理斜线和其他问题字符不会有什么问题。此外,如果我清理文件名,可能会有重复,因此任何清理脚本都必须在扩展名前添加类似“-1”的内容以确保不会丢失任何内容。
我并不依赖这个脚本,但它是可以理解的,这是优点。此文件服务器上安装了 Mac OS X 10.6,但我可以访问任何最新版本的 OS X。
答案1
我仍然不能 100% 确定我理解了这个问题,但这里有一些想法。
sed 's/:.*//'
会破坏任何包含冒号的文件名。冒号在 Mac 上是合法的文件名字符吗?如果不是,那么这对你来说不是问题。否则,请考虑执行sed 's/: Word.Document.8$//'
或sed 's/: [^:]*$//'
。。mv
生成的命令看起来xargs
有问题。请尝试
xargs -I % sh -c 'echo mv "%" "%.doc"'
。
答案2
第二个问题是,我如何更改脚本以便它可以同时查找多种文件类型并为每种文件类型提供适当的扩展名?
以下是一些可帮助您入门的提示:
sed -e '/Word\.Document\.8/s/某物/其他东西/;秒/其他/完后还有/' \ -e '/Excel\.Sheet\.8/s/某事/其他东西/;秒/另外2/还有2/' \ ...
或者
awk' /Word\.文档\.8/ { Word 的 awk 命令 } /Excel\.Sheet\.8/ { Excel 的 awk 命令 } ⋮ ‘