Vários links simbólicos por caractere curinga: “ln -s ../*/*.txt TXT /”

1

Estou tentando criar vários links simbólicos usando curinga, aqui está o exemplo:

$ ls -R
.:
TXT  a  b

./TXT:

./a:
a.txt

./b:
b.txt

Existe um "diretório-pai" contendo vários subdiretórios: a, b, TXT. Em "a" e "b" existem vários arquivos de texto (a.txt, b.txt no exemplo).

Eu quero criar links simbólicos "relativos" para cada arquivo ".txt" no "TXT" subdir. Mas:

  • sem usar "localizar"
  • sem "cd" no diretório TXT

Em outras palavras, quero saber por que um comando como o seguinte não trabalho:

ln -s ../*/*txt TXT/

Com um "cd TXT" anterior, funciona:

cd TXT
ln -s ../*/*txt .

Eu acho que o problema aparece devido a expansão bash de "*" e "../", bash não é capaz de expandir "../*/*.txt" porque esses arquivos realmente não existem, então " ln "não pode criar os links desejados: ele cria links para arquivos txt de diretórios "um nível acima" em relação ao diretório de trabalho atual. Ele "cd" para ".." e considera todos os dirs neste nível, procurando pelos arquivos ".txt" dentro deles.

Talvez "a regra" possa ser um link simbólico para o TARGET:

  • aponte ao mesmo tempo para arquivos reais existentes (caso contrário, o bash não poderá expandir ".." ou "*" no caminho certo)
  • e deve ser relativo ao DIRETÓRIO que conterá o link

Você poderia confirmar e explicar qual é exatamente o problema e possíveis soluções?

PS. Usando "find", um comando como o seguinte parece funcionar:

find ./ -path ./TXT -prune -o -iname "*.txt" -type f -exec ln -s ."{}" -t TXT/ \;

Note que, mesmo neste caso, eu tenho que usar um caminho "não existente":

."{}"

Mas o comando -exec apenas expande "{}" que é "./a/a.txt" e "./b/b.txt", então "ln" pode construir o caminho certo em relação ao TXT destdir, obrigado para o ponto prefixado ".".

    
por Joe 14.12.2017 / 11:06

1 resposta

2

Você está usando este comando

ln -s ../*/*txt TXT/

Se você estiver no diretório que contém a , b e TXT , o shell não conseguirá expandir ../*/*txt para corresponder a algo em a ou b . Você teria que usar */*txt para isso, mas, em seguida, os links simbólicos dentro de TXT seriam desativados em um nível e precisariam de outro ../ em seus caminhos relativos.

A solução mais fácil seria essa, mas você diz que quer evitar cd

( cd TXT && ln -s ../*/*txt . )

Outra solução exigiria a correção dos links, por sua vez

for f in */*txt
do
    ln -s ../"$f" TXT
done

Lembre-se de que, como você tem seus diretórios de origem a e b no mesmo nível que TXT , os curingas nas duas sugestões corresponderão a todos os três diretórios.

    
por 14.12.2017 / 13:36

Tags