使用 Linux Centos 6
我有 16 年的数据,按年份和日期(1997/001、1997/002……)排序在目录中。每个“天”目录有 24 个文件,每个小时 1 个,每个文件中都有小时名称(即1997.001.00.bin
…… 1997.001.01.bin
)1997.001.23.bin
。
我无法更改文件名或用于命名文件的算法。我有一个脚本,可以读取文件中的元数据并将其存档到正确的年/日目录中。但是,每天的第一个文件实际上从 23:59:59 开始。因此,每天的第一个文件实际上是在前一天存档的。1997.001.00.bin
实际上存档在1996/365
目录中。
我需要生成符号链接,以便 的链接1997.001.00.bin
位于 中1997/001
并指向 中的实际位置1996/365
。如果只有几个文件,我只需手动运行命令,但我需要对 5000 多个文件执行此操作。任何有关为脚本生成一些命令的帮助都将不胜感激。
答案1
在包含 2012、2013 等的目录中运行此程序。
find * -type f -name "*bin" -exec sh -c 'ln -s ../../{} `echo {} | sed -r '\''s,.*/([0-9]+)\.([0-9]+).*,\1/\2,'\''`' \;
它会查找 *bin 文件(常规文件而非符号链接),并在正确的目录中为每个文件创建符号链接。它可以多次运行而不会出现问题,例如在创建新的 *bin 文件后,但您会收到类似 的错误ln: failed to create symbolic link ‘2013/002/2013.002.00.bin’: File exists
。这些可以忽略。
答案2
如果错误存档的文件名称正确,则这应该有效(只需将其粘贴到父目录中的终端中):
nxtyear="";
tmrow="";
for year in $(seq 2012 -1 1996); do
for day in $(seq -f "%03g" 365 -1 1); do
[ -d $year/$tmrow ] &&
ln -s ../../$year/$day/$nxtyear.$tmrow.00.bin $nxtyear/$tmrow/;
tmrow=$day;
nxtyear=$year;
done;
done
假设 1997 年的第一个文件位于1996/365/1997.001.00.bin
。换句话说,它的名称正确但位置不正确。如果不是这种情况,请告诉我,我会修改我的答案。
解释
上面的小脚本会循环显示从 2012 年到 1996 年的每一年,同样循环显示从 365 到 001 的所有数字。在循环结束时,它会将当前日期保存为,$tmrow
将当前年份保存为$nxtyear
。第一次运行时,这些将是未定义的,脚本不会执行任何操作(这就是我用 检查目录是否存在的原因[ -d $year/$tmrow ] &&
)。
每次脚本循环时,它都会将一个名为 的文件链接 $year/$day/$nxtyear.$tmrow.00.bin
到$nxtyear/$tmrow/
。因此,例如,当$year
是1996
,且$day
是365
,$nxtyear
将是1997
且$tmrow
将是 时001
。因此,脚本将运行
ln -s 1996/365/1997.001.00.bin 1997/001/
echo
您可以通过添加以下行来检查脚本将执行的操作,而无需进行任何更改ln
:
[ -d $year/$tmrow ] &&
echo ln -s $year/$day/$nxtyear.$tmrow.00.bin $nxtyear/$tmrow/;