GNU/Linux >> Belajar Linux >  >> Linux

Batch Perbarui Tautan Simbolik Secara Rekursif

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:

  1. Direktori tempat Anda ingin melakukan penggantian nama kumpulan symlink
  2. Pola lama. Di sini link1 adalah pola lama yang akan diganti
  3. Pola baru. Di sini link2 adalah pola baru yang digunakan link1 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"


Linux
  1. Pembaruan Otomatis?

  2. Variabel lingkungan dalam tautan simbolik

  3. Perilaku cd/bash pada tautan simbolik

  1. Ubah ekstensi file secara rekursif di Bash

  2. Bagaimana cara menyalin tautan simbolik?

  3. gunakan SED secara rekursif di linux?

  1. Cara memperbarui symlink Linux

  2. Temukan File Terbesar Secara Rekursif?

  3. Apakah ada cara untuk memeriksa apakah ada tautan simbolik yang mengarah ke direktori?