注意该文件似乎是“复合文档文件 V2 文档”格式。可能有一些图书馆可以以适当的方式阅读它。
疯狂猜测:您是否正在尝试“阅读” Outlook.msg
文件、word/excel 文档?
使用file
或查看
添加了更新C++ 版本(见下文)
对该文件稍作修改告诉我这是一个二进制文件,字符串没有分隔,但前面是它们的长度字节。所以,这个 bash 脚本应该可以正常工作:
#!/bin/bash
set -e # stop on errors
for originalname in "$@"
do
# get lengths
first_len=$(od -j 2085 "$originalname" -An -t u1 -N1)
second_len=$(od -j $((2086 + $first_len)) "$originalname" -An -t u1 -N1)
# strip whitespace
read first_len second_len <<< "$first_len $second_len"
# extract the words as text
firstword=$(dd if="$originalname" bs=1 skip=2086 count=$first_len)
secondword=$(dd if="$originalname" bs=1 skip=$((2087+$first_len)) count=$second_len)
# calculate new name, using the timestamp of the file too:
newname="$firstword $secondword $(date -r "$originalname" +"%Y-%m-%d")"
# do the move (verbosely)
mv -v "$originalname" "$(dirname "$originalname")/$newname"
done
我在您提供的文件上对其进行了测试:
$ ./test.sh short.zhr 2>/dev/null
`short.zhr' -> `./MyName Sirname 2013-06-11'
你一定会喜欢 UNIX 哲学 :)
对于您的情况,您可以运行
./test.sh somedir/AA*
C++ 版本
为了好玩,我写了一个 C++ 版本。这应该很容易移植。
它实际上更具可读性(除了格式化时间戳的部分......)。
#include <string>
#include <vector>
#include <fstream>
#include <ctime>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>
std::string extract_string(std::istream& is) {
char len;
if (is && is.read(&len, 1)) {
std::string result(len, '\0');
is.read(&*result.begin(), len);
return result;
}
return "";
}
std::string timestamp(std::string const& fname, const char* fmt = "%Y-%m-%d")
{
struct stat sb;
if (-1 == stat(fname.c_str(), &sb))
perror("cannot get file stats");
if (struct tm* tmp = localtime(&sb.st_ctime))
{
std::string buf(200, '\0');
buf.resize(strftime(&*buf.begin(), buf.size(), fmt, tmp));
return buf;
} else
perror("localtime failed");
return "";
}
int main(int argc, const char *argv[])
{
for (int i = 1; i<argc; ++i)
{
const std::string fname(argv[i]);
std::ifstream stream(fname.c_str(), std::ios::binary);
stream.seekg(2085);
std::string first = extract_string(stream);
std::string second = extract_string(stream);
std::string newname = first + " " + second + " " + timestamp(fname);
std::cout << (("rename \"" + fname + "\" \"" + newname + "\"").c_str());
}
}
你会以完全相同的方式使用它。当然,您可以改为打印,newname
并从您自己的脚本中使用它。 编辑编辑版本以交叉编译为 win-exe。让它打印一个rename
命令。