GNU/Linux >> Znalost Linux >  >> Linux

Hromadná aktualizace symbolických odkazů rekurzivně

Tento příkaz bash by to měl udělat za vás:

find /home/user/public_html/qa/ -type l -lname '/home/user/public_html/dev/*' -printf 'ln -nsf "$(readlink "%p" | sed s/dev/qa/)" "$(echo "%p" | sed s/dev/qa/)"\n' > script.sh

Používá find k identifikaci všech souborů v qa adresář, což jsou symbolické odkazy s cílem, který je v dev adresář a pro každý z nich vytiskne příkaz bash, který nahradí odkaz odkazem na ekvivalentní cestu v qa/ . Po spuštění spusťte vygenerovaný skript pomocí

bash script.sh

Možná jej budete chtít nejprve prozkoumat ručně, abyste se ujistili, že funguje.

Zde je podrobnější verze výše uvedeného find příkaz pro snazší čtení (i když bych to takto v praxi nezbytně nepsal):

SRC_DIR="/home/user/public_html/qa"
OLD_TARGET="/home/user/public_html/dev"
SUB="s/dev/qa/"

find $SRC_DIR -type l \
  -lname "$OLD_TARGET/*" -printf \
  'ln -nsf "$(readlink "%p"|sed $SUB)" "$(echo "%p"|sed $SUB)"\n'\
 > script.sh

V případě, že to někdo jiný najde při hledání řešení:Vytvořte soubor s názvem „linkmod.sh“ obsahující:

#!/bin/sh
PATTERN1=`echo "$2"`
PATTERN2=`echo "$3"`
LINKNAME=`echo "$1"`
OLDTARGET=`readlink "$1"`
NEWTARGET=`echo "$OLDTARGET" \
| sed -e 's/'"$PATTERN1"'/'"$PATTERN2"'/'`
echo ln -nsf "$NEWTARGET" "$LINKNAME"

a spustit

find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"

V případě potřeby můžete použít volbu -lname v find.

POZNÁMKA:musíte použít 2x \ ve vzorech před znaky, které vyžadují \ v sed, protože echo jeden odstraní. Například

find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"

Odstraňte echo z posledního řádku, pokud jsou příkazy ln správné.


Vytvořil jsem bash skript link_rename.sh pro rekurzivní přejmenování symbolických odkazů v daném adresáři

#! /bin/bash

DIR=$1
OLD_PATTERN=$2
NEW_PATTERN=$3

while read -r line
do
    echo $line
    CUR_LINK_PATH="$(readlink "$line")"
    NEW_LINK_PATH="$CUR_LINK_PATH"  
    NEW_LINK_PATH="${NEW_LINK_PATH/"$OLD_PATTERN"/"$NEW_PATTERN"}"
    rm "$line"
    ln -s "$NEW_LINK_PATH" "$line"
done <<< $(find "$DIR" -type l)

Může být spuštěn jako link_rename.sh /home/human/dir link1 link2

Skript má 3 argumenty:

  1. Adresář, ve kterém chcete provést dávkové přejmenování symbolických odkazů
  2. Starý vzor. Zde link1 je starý vzor, ​​který bude nahrazen
  3. Nový vzor. Zde link2 je nový vzor, ​​se kterým link1 bude nahrazen

Skript rekurzivně čte všechny symbolické odkazy v adresáři pomocí find "$DIR" -type l a zpracovává jej řádek po řádku.

$line je symbolický odkaz, který je třeba přejmenovat

CUR_LINK_PATH je stará cesta

NEW_LINK_PATH se získá provedením nahrazení řetězce ve staré cestě odkazu.

Starý symbolický odkaz se odstraní a pomocí ln -s "$NEW_LINK_PATH" "$line" se vytvoří nový symbolický odkaz


Linux
  1. Jak aktualizovat symbolický odkaz pro Linux

  2. Najít největší soubory rekurzivně?

  3. používat SED rekurzivně v linuxu?

  1. Automatická aktualizace?

  2. Existuje způsob, jak zkontrolovat, zda existují symbolické odkazy směřující do adresáře?

  3. Proměnné prostředí v symbolických odkazech

  1. Chování cd/bash na symbolických odkazech

  2. Rekurzivně měnit přípony souborů v Bash

  3. Jak zkopírovat symbolické odkazy?