1

Использование 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+ файлов. Любая помощь в создании некоторых команд для скрипта будет принята с благодарностью.

2 ответа2

3

Запустите это в каталоге, который содержит 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 . Это можно игнорировать.

0

Если неправильно заархивированный файл имеет правильное имя, это должно сработать (просто вставьте его в терминал в родительском каталоге):

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/;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .