LINUX: Vincular todos os arquivos de um diretório para outro [fechado]

123

Quero vincular ( ln -s) todos os arquivos que estão /mnt/usr/lib/dentro/usr/lib/

Existem muitos arquivos, como isso pode ser feito rapidamente? :)

SharpC
fonte
Quantos arquivos são "lotes" e com que rapidez você considera "rápido"?
Eric Smith
4
Isso é 50:50, se caberia "serverfault" ou "superuser", mas não está programando, portanto, não no stackoverflow.
Marc Gravell

Respostas:

202
ln -s /mnt/usr/lib/* /usr/lib/

Eu acho que isso pertence ao superusuário, no entanto.

Tim Cooper
fonte
6
Isso não inclui arquivos ocultos e vincula diretórios inteiros. Se um desses não for o que você deseja, veja minha resposta. Caso contrário, é o caminho mais curto.
Cascabel
Você está certo. Mas as bibliotecas geralmente não estão ocultas. Em qualquer caso, os dotfiles estão envolvidos, sua solução é mais útil.
1
apontará para a outra pasta permanentemente?
precisa saber é o seguinte
@YuPPie Acho que ele cria um hardlink para todos os arquivos do diretório. (era isso que eu queria hoje, então +1: D)
Exibir nome
2
@SargeBorsch Cria links simbólicos (links físicos são diferentes).
jsejcksn
90

O GNU cptem uma opção para criar links simbólicos em vez de copiar.

cp -rs /mnt/usr/lib /usr/

Note que esta é uma extensão GNU não encontrada no POSIXcp .

caf
fonte
4
Seu diretório atual deve ser / usr / para fazer ligação simbólica desta forma
Soul_man
@caf Se o destino for pasta existente, em seguida, a pasta lib é criado dentro em / usr / pasta
Tamil Selvan C
2
Boa resposta. Também pode ser usado para criar hardlinks com -l em vez de -s.
fax
19
ln -s /mnt/usr/lib/* /usr/lib/
Michael Krelin - hacker
fonte
15

As soluções publicadas não vincularão nenhum arquivo oculto. Para incluí-los, tente o seguinte:

cd /usr/lib
find /mnt/usr/lib -maxdepth 1 -print "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done

Se você desejar criar recursivamente os diretórios e vincular apenas os arquivos (para que, se você criar um arquivo dentro de um diretório, ele realmente /usr/libnão esteja /mnt/usr/lib), faça o seguinte:

cd /usr/lib
find /mnt/usr/lib -mindepth 1 -depth -type d -printf "%P\n" | while read dir; do mkdir -p "$dir"; done
find /mnt/usr/lib -type f -printf "%P\n" | while read file; do ln -s "/mnt/usr/lib/$file" "$file"; done
Cascabel
fonte
2
Eu acredito que isso também deve funcionar como uma forma de curinga em arquivos ocultos, se você tiver estendido as globbing ativadas no bash. Ele combina com tudo começando com um ponto, seguido por algo que não seja nada ou outro ponto (ou seja, que exclui ./e ../):ln -s /mnt/usr/lib/.!(|.)* /usr/lib
Cascabel