Perintah bash ini harus melakukannya untuk Anda:
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
Ini menggunakan find
untuk mengidentifikasi semua file di qa
direktori yang merupakan link simbolik dengan target yang ada di dev
direktori, dan untuk masing-masing, itu mencetak perintah bash yang akan mengganti tautan dengan tautan ke jalur yang setara di qa/
. Setelah Anda menjalankan ini, cukup jalankan skrip yang dihasilkan dengan
bash script.sh
Anda mungkin ingin memeriksanya secara manual terlebih dahulu untuk memastikannya berfungsi.
Ini adalah versi yang lebih lengkap dari find
di atas perintah untuk membaca lebih mudah (meskipun saya tidak perlu menulis seperti ini dalam praktik):
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
Jika ada orang lain yang menemukan ini saat mencari solusi:Buat file bernama "linkmod.sh" yang berisi:
#!/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"
dan jalankan
find . -type l -print0 | xargs -0IX echo linkmod.sh X "pattern1" "pattern2"
Anda dapat menggunakan opsi -lname di find jika diperlukan.
CATATAN:Anda harus menggunakan 2x \ dalam pola sebelum karakter apa pun yang membutuhkan \ in sed, karena gema menghapusnya. Misalnya
find . -type l -print0 | xargs -0IX echo linkmod.sh X "folder\\ name\\/file" "folder2\\ name\\/file"
Hapus echo
dari baris terakhir jika perintah ln sudah benar.
Saya membuat skrip bash link_rename.sh
untuk tautan simbolis yang diganti namanya secara rekursif di direktori tertentu
#! /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)
Itu dapat dieksekusi sebagai link_rename.sh /home/human/dir link1 link2
Skrip memiliki 3 argumen:
- Direktori tempat Anda ingin melakukan penggantian nama kumpulan symlink
- Pola lama. Di sini
link1
adalah pola lama yang akan diganti - Pola baru. Di sini
link2
adalah pola baru yang digunakanlink1
akan diganti
Skrip secara rekursif membaca semua symlink di direktori menggunakan find "$DIR" -type l
dan memprosesnya baris demi baris.
$line
adalah symlink yang perlu diganti namanya
CUR_LINK_PATH
adalah jalan lama
NEW_LINK_PATH
diperoleh dengan melakukan penggantian string di jalur tautan lama.
Symlink lama dihapus dan symlink baru dibuat menggunakan ln -s "$NEW_LINK_PATH" "$line"