需要一些关于创建符号链接的帮助

需要一些关于创建符号链接的帮助

使用 Linux Centos 6

我有 16 年的数据,按年份和日期(1997/001、1997/002……)排序在目录中。每个“天”目录有 24 个文件,每个小时 1 个,每个文件中都有小时名称(即1997.001.00.bin…… 1997.001.01.bin1997.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/。因此,例如,当$year1996,且$day365$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/;

相关内容