Bagaimana saya bisa menghapus semua tautan simbolik dengan target khusus?

43

Dengan perintah:

ls -la *

Saya dapat mendaftar semua tautan simbolis saya.

Bagaimana saya bisa menghapus semua tautan simbolis yang ditautkan ke folder khusus?

Sebagai contoh:

Dalam direktori saya, usr/local/binsaya memiliki entri berikut:

lrwxrwxrwx 1 root root 50 Apr 22 14:52 allneeded -> /usr/local/texlive/2011/bin/x86_64-linux/allneeded
lrwxrwxrwx 1 root root 47 Apr 22 14:52 amstex -> /usr/local/texlive/2011/bin/x86_64-linux/amstex
lrwxrwxrwx 1 root root 24 Apr 23 19:09 arara -> /home/marco/.arara/arara

Sekarang saya ingin menghapus semua tautan dengan path /usr/local/texlive/

Marco Daniel
sumber
1
Apakah maksud Anda menghapus semua symlink yang tertaut ke folder target? Atau pindahkan semua symlink yang ditemukan ke folder tertentu?
George M
@uther: Maksud saya menghapus tautan.
Marco Daniel

Jawaban:

63

Pastikan Anda membaca jawaban alternatif . Bahkan lebih ke titik meskipun tidak memilih setinggi pada saat ini.

Anda dapat menggunakan ini untuk menghapus semua tautan simbolis:

find -type l -delete

dengan findversi modern .

Pada versi find yang lebih lama mungkin harus:

find -type l -exec rm {} \;
# or
find -type l -exec unlink {} \;

Untuk membatasi ke target tautan tertentu, dengan asumsi tidak ada jalur yang mengandung karakter baris baru:

 find -type l | while IFS= read -r lnkname; do if [ "$(readlink '$lnkname')" == "/your/exact/path" ]; then rm -- "$lnkname"; fi; done

atau diformat dengan baik

 find -type l |
 while IFS= read -r lnkname;
 do
   if [ "$(readlink '$lnkname')" = "/your/exact/path" ];
   then
     rm -- "$lnkname"
   fi
 done

The iftentu saja dapat juga mencakup kondisi yang lebih kompleks seperti pencocokan pola dengan grep.


Disesuaikan dengan kasus Anda:

find -type l | while IFS= read -r lnk; do if (readlink "$lnk" | grep -q '^/usr/local/texlive/'); then rm "$lnk"; fi; done

atau diformat dengan baik:

find -type l | while IFS= read -r lnk
do
  if readlink "$lnk" | grep -q '^/usr/local/texlive/'
  then
    rm "$lnk"
  fi
done
0xC0000022L
sumber
Apakah perintah ini menghapus semua symlink? Silakan lihat hasil edit saya di atas ..
Marco Daniel
@ Marsco: ya, tiga baris pertama akan. Mengedit lebih lanjut :)
0xC0000022L
Saya juga akan menambahkan -printdi akhir findperintah untuk mendapatkan umpan balik visual.
runlevel0
30

Dengan modern findyang mendukung -lname:

find /usr/local/bin -lname '/usr/local/texlive/*' -delete

harus melakukannya.

Christoffer Hammarström
sumber
1
Itu adalah solusi yang bagus dan sederhana. Saya diuji dan bekerja seperti pesona. Terima kasih
Marco Daniel
Agaknya itu seharusnyafind /usr/local/bin
James Youngman
1
Bahkan tidak modern, tentu saja. GNU findtelah memiliki -lnamelebih lama dari yang saya pertahankan (sejak sekitar 2003).
James Youngman
@JamesYoungman: Terima kasih! Secara modern, yang findsaya maksud adalah GNU find. ;) Saya menggunakan usr/local/bin, karena itulah yang digunakan OP.
Christoffer Hammarström
5

The findsolusi adalah besar.

Kalau-kalau temuan Anda tidak mendukung -lname, inilah cara lain yang hanya menggunakan shell dan readlink.

cd /usr/local/bin
for f in *; do
  case "$(readlink "$f")" in /usr/local/texlive/*)
    rm "$f"
    ;;
  esac
done
Mikel
sumber
1

Dengan zsh:

rm -f /usr/local/bin(@e'{[[ $REPLY:P = /usr/local/texlive/* ]]}')

$REPLY:Psepenuhnya menyelesaikan jalur ke yang bebas-symlink, jadi dengan anggapan /usr/local/texliveitu bebas dari symlink, itu akan menghapus semua file yang setelah resolusi symlink tinggal di bawah /usr/local/textliveyang akan menyertakan tautan ke /usr/local/texlive/footetapi juga ke ../texlive/baratau ke /usr/./local/texlive/whateveratau ke /some/other/symlinkyang dengan sendirinya menunjuk ke symlink /usr/local/texlive, dll. .

Stéphane Chazelas
sumber
0

Buka path Anda dan atur konfigurasi path sendiri

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf
Wallance
sumber
Karena ini adalah jalan seperti usr/local/binyang grepdicari, grep -Eadalah cara untuk pergi. Kalau tidak, tidak akan ada hasil yang cocok. Juga hdi lstidak melayani tujuan apa pun di sini! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Untuk lebih lanjut lihat man lsatauman grep
ss_iwe