Encuentre todos los enlaces simbólicos en un directory y cambie el destino a otro directory

Tengo un montón de enlaces simbólicos en /home a files y subdirectorys en /foo . Quiero apuntar al nuevo directory /bar .

Mi enfoque fue mirar todos los enlaces simbólicos no válidos y verificar que estaban apuntando a /foo . Luego hice lo siguiente:

 sudo find . -type l -! -exec test -e {} \; -exec sh -c '\ old_link_target=$(readlink "$0"); \ new_link_target=${old_link_target//foo/bar}; \ ln -snf $new_link_target $0' {} \; 

Sin embargo, quiero un enfoque más preciso que no incluya el paso inicial de poner los ojos en los enlaces simbólicos no válidos. Entonces, por el bien de esta pregunta, supongamos que aún existe, por lo que se requiere otro enfoque.

GNUly:

 find . -lname '/foo*' -printf '%p\0%l\0' | awk -vRS='\0' ' { getline target sub("^/foo", "/bar", target) printf("%s\0%s\0", target, $0) }' | xargs -r0n2 ln -sfT 

O con sed reciente de GNU:

 find . -lname '/foo*' -printf '%l\0%p\0' | sed -z 's|^/foo|/bar|;n' | xargs -r0n2 ln -sfT 

Tenga en count que potencialmente afectará la propiedad de los enlaces simbólicos (por ejemplo, su autor original no podrá eliminarlos más si están en un directory que no son de su propiedad pero tienen acceso de escritura y tiene el t bit establecido (como /tmp )).

Para evitar eso, puede usar GNU tar lugar:

 find . -lname '/foo*' -print0 | tar --null -T - -cf - --transform='s@^/foo@/bar@' | tar xpf - 

Aquí hay un pequeño set de testings:

 mkdir ./tmp1 ./tmp2 touch ./tmp1/file1 ./tmp2/file2 ln -s ./tmp1 ./tmp3 ls -H ./tmp3 

SALIDA

 file1 

Entonces ahora voy a …

 mount --bind ./tmp2 ./tmp1 ls -H ./tmp3 

SALIDA

 file2 

tada! Ahora todos los enlaces que alguna vez apuntaban a ./tmp1 apuntan automáticamente a ./tmp2 , ya que, de hecho, también lo hace ./tmp1 porque son el mismo punto de assembly. Had ./tmp2 contenía monturas de niños que podría haber hecho:

 mount --rbind ./tmp2 ./tmp1 

Y de forma recursiva: --bind los treees. Y eso ni siquiera araña la superficie de las opciones de mount subtreees compartidos del núcleo de Linux.

En un sistema Linux, no tiene que preocuparse demasiado por el directory al que apunta un file porque puede afectar atómicamente la location de ese file utilizando el tree de assembly del sistema de files virtual del kernel: está a su disposition. Y puedes administrar todo en /etc/fstab .

 >>/etc/fstab \ printf '%s %s none bind,defaults 0 0\n' \ "/bar" "/foo" 

Y tus problemas están resueltos.