Precisa de ajuda para criar links sym

1

Usando o Linux Centos 6

Eu tenho 16 anos de dados classificados em diretórios por ano e depois por dia (1997/001, 1997/002 ...). Cada diretório de 'dia' tem 24 arquivos, 1 para cada hora, com o nome da hora em cada arquivo (por exemplo, 1997.001.00.bin , 1997.001.01.bin ... 1997.001.23.bin ).

Não consigo alterar o nome do arquivo ou o algoritmo usado para nomear os arquivos. Eu tenho um script que lê os metadados no arquivo e arquiva no diretório de ano / dia correto. No entanto, o primeiro arquivo de cada dia realmente começa às 23:59:59. Então, esse primeiro arquivo de cada dia realmente é arquivado no dia anterior. 1997.001.00.bin é realmente arquivado no diretório 1996/365 .

Eu preciso gerar links simbólicos para que o link para 1997.001.00.bin resida em 1997/001 e aponte para o local real em 1996/365 . Se fossem apenas alguns arquivos, eu apenas executaria o comando manualmente, mas preciso fazer isso para mais de 5.000 arquivos. Qualquer ajuda na geração de alguns comandos para um script seria muito apreciada.

    
por Suri 02.09.2013 / 03:58

2 respostas

3

Execute isso no diretório que contém 2012, 2013, etc.

find * -type f -name "*bin" -exec sh -c 'ln -s ../../{} 'echo {} | sed -r '\''s,.*/([0-9]+)\.([0-9]+).*,/,'\'''' \;

Ele encontra arquivos bin que são arquivos regulares, não symlinks, e cria um symlink para cada um deles no diretório correto. Ele pode ser executado várias vezes sem problemas, por exemplo, depois que novos arquivos * bin forem criados, mas você receberá erros como ln: failed to create symbolic link ‘2013/002/2013.002.00.bin’: File exists . Estes podem ser ignorados.

    
por 02.09.2013 / 05:15
0

Se o arquivo mal-arquivado for nomeado corretamente, isso deve funcionar (basta colá-lo em um terminal no diretório pai):

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

Isso pressupõe que o primeiro arquivo de 1997 está em 1996/365/1997.001.00.bin . Em outras palavras, ele é nomeado corretamente, mas colocado incorretamente. Se este não for o caso, me avise e modificarei minha resposta.

Explicação

O pequeno script acima irá percorrer todos os anos de 2012 a 1996 para trás e, da mesma forma, para todos os números de 365 a 001. Ao final do loop, ele salvará o dia atual como $tmrow e o ano atual como% código%. A primeira vez que ele for executado, ele será indefinido e o script não fará nada (é por isso que estou verificando se o diretório existe com $nxtyear ).

Sempre que o script fizer um loop, ele vinculará um arquivo chamado [ -d $year/$tmrow ] && to $year/$day/$nxtyear.$tmrow.00.bin . Assim, por exemplo, quando $nxtyear/$tmrow/ é $year e 1996 é $day , 365 será $nxtyear e 1997 será $tmrow . O script, portanto, será executado

 ln -s 1996/365/1997.001.00.bin 1997/001/

Você pode verificar o que o script fará sem fazer alterações adicionando 001 à echo line:

[ -d $year/$tmrow ] && 
echo ln -s $year/$day/$nxtyear.$tmrow.00.bin $nxtyear/$tmrow/;
    
por 02.09.2013 / 05:39