Crie links simbólicos com curingas

6

Eu tenho vários discos rígidos com a mesma hierarquia de diretórios, por exemplo:

/media/sda/dir1
/media/sda/dir2
...
/media/sdb/dir1
/media/sdb/dir2

Dois discos rígidos com nomes semelhantes e nomes de diretório semelhantes. Eu quero criar links simbólicos separados para dir1 e dir2 em cada disco rígido. A maneira mais fácil que encontrei é usar cp -sR :

cp -sR /media/sd*/dir1 /somedir/dir1
cp -sR /media/sd*/dir2 /somedir/dir2

No entanto, isso cria novos diretórios em / somedir que tem vários efeitos colaterais, por exemplo, os registros de data e hora do diretório são inúteis.

Como posso criar links simbólicos chamados dir1 e dir2 que ligam a / media / sd * / dir1 e / media / sd * / dir2? Os arquivos são adicionados regularmente aos discos rígidos, então eu precisaria executar esses comandos regularmente.

    
por Haukur 22.08.2012 / 04:30

2 respostas

1

Você pode querer fazer isso:

for dir in dir1 dir2
do
  [[ ! -d /somedir/$dir ]] && mkdir /somedir/$dir    
  find /media/sd*/$dir -type f -exec bash -c \
    '[[ ! -f /somedir/'$dir'/$(basename $1) ]] && ln -s $1 /somedir/'$dir'/' foo {} \;
done

Isto cria links simbólicos em / somedir / dir1 / (resp. dir2) apontando para todos os arquivos presentes em / media / sd * / dir1 (resp. dir2). Este script não preserva a hierarquia que pode estar presente nos diretórios de origem.

Edit: Se você quiser que todos os links sejam colocados em um único diretório, aqui está uma versão ligeiramente modificada:

[[ ! -d /somedir/data ]] && mkdir /somedir/data    
find /media/sd*/dir[12] -type f -exec bash -c \
    '[[ ! -f /somedir/data/$(basename $1) ]] && ln -s $1 /somedir/data/' foo {} \;
done
    
por 22.08.2012 / 10:36
6

Isso criará links simbólicos /somedir/dir1/* apontando para /media/sd*/dir1/* .

mkdir /somedir/dir1
ln -sf /media/sd*/dir1 /somedir/dir1

Se um arquivo ou diretório existir em mais de um /media/sd*/dir1/ , o link apontará para o último, por exemplo, se você tiver:

/media/sda1/dir1/Movies
/media/sda1/dir1/Pictures
/media/sdb1/dir1/Data

você receberá:

/somedir/dir1/Movies -> /media/sdb1/dir1/Movies
/somedir/dir1/Pictures -> /media/sda1/dir1/Pictures
/somedir/dir1/Data -> /media/sdb1/dir1/Data

Não tenho certeza se é isso que você quer.

Parece-me que unionfs de montagem sobre /media/sd* serviria melhor ao seu propósito do que links simbólicos.

    
por 22.08.2012 / 10:52

Tags