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:
- Adresář, ve kterém chcete provést dávkové přejmenování symbolických odkazů
- Starý vzor. Zde
link1
je starý vzor, který bude nahrazen - Nový vzor. Zde
link2
je nový vzor, se kterýmlink1
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