Làm cách nào tôi có thể xóa tất cả các liên kết tượng trưng với một mục tiêu đặc biệt?


43

Với lệnh:

ls -la *

Tôi có thể liệt kê tất cả các liên kết tượng trưng của tôi.

Làm cách nào tôi có thể xóa tất cả các liên kết tượng trưng được liên kết đến một thư mục đặc biệt?

Ví dụ:

Trong thư mục của usr/local/bintôi, tôi có các mục sau:

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

Bây giờ tôi muốn xóa tất cả các liên kết với đường dẫn /usr/local/texlive/


1
Bạn có nghĩa là loại bỏ tất cả các liên kết tượng trưng được liên kết đến một thư mục đích? Hoặc di chuyển tất cả các liên kết tượng tìm thấy vào một thư mục cụ thể?
George M

@uther: Ý tôi là xóa các liên kết.
Marco Daniel

Câu trả lời:


63

Hãy chắc chắn để đọc câu trả lời thay thế . Nó thậm chí còn hơn thế nữa mặc dù không được bình chọn cao như vậy vào thời điểm này.

Bạn có thể sử dụng điều này để xóa tất cả các liên kết tượng trưng:

find -type l -delete

với các findphiên bản hiện đại .

Trên các phiên bản tìm cũ hơn có thể phải là:

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

Để giới hạn ở một mục tiêu liên kết nhất định, giả sử không có đường dẫn nào chứa bất kỳ ký tự dòng mới nào:

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

hoặc định dạng độc đáo

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

Tất ifnhiên cũng có thể bao gồm một điều kiện phức tạp hơn như khớp một mẫu với grep.


Phù hợp với trường hợp của bạn:

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

hoặc được định dạng độc đáo:

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

Lệnh này có loại bỏ tất cả các liên kết tượng trưng không? Xin vui lòng xem chỉnh sửa của tôi ở trên ..
Marco Daniel

@Marco: vâng, ba dòng đầu tiên sẽ. Chỉnh sửa thêm :)
0xC0000022L

Tôi cũng sẽ thêm một -printphần cuối của findlệnh để có được một số phản hồi trực quan.
runlevel0

30

Với sự hiện đại findhỗ trợ -lname:

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

Hãy làm nó.


1
Đó là một giải pháp tuyệt vời và đơn giản. Tôi đã thử nghiệm và nó hoạt động như một lá bùa. Cảm ơn
Marco Daniel

Có lẽ nên như vậyfind /usr/local/bin
James Youngman

1
Thậm chí không hiện đại. GNU findđã -lnameduy trì lâu hơn tôi đã duy trì nó (kể từ khoảng năm 2003).
James Youngman

@JamesYoungman: Cảm ơn! Bởi hiện đại findtôi thực sự có nghĩa là GNU find. ;) Tôi đã sử dụng usr/local/bin, vì đó là những gì OP đã sử dụng.
Christoffer Hammarström

5

Các findgiải pháp là rất tốt.

Chỉ trong trường hợp tìm thấy của bạn không hỗ trợ -lname, đây là một cách khác chỉ sử dụng shell và readlink.

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

1

Với zsh:

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

$REPLY:Phoàn toàn giải quyết các đường dẫn đến một liên kết tượng trưng-miễn phí, vì vậy giả định /usr/local/texlivelà liên kết tượng trưng giải phóng bản thân, nó sẽ loại bỏ tất cả các file mà sau khi độ phân giải liên kết tượng trưng dưới sống /usr/local/textlivetrong đó sẽ bao gồm các liên kết đến /usr/local/texlive/foomà còn để ../texlive/barhay /usr/./local/texlive/whateverhay /some/other/symlinkmà là chính nó một liên kết tượng trưng chỉ ở /usr/local/texlive, vv .


0

Đi đến đường dẫn của bạn và tự đặt cấu hình đường dẫn

ls -alh|grep "your-pattern-to-file-or-folder-for-symlink"| awk '{print $9}'|xargs rm -rf

Vì đây là những con đường như usr/local/binrằng grepđang tìm kiếm, grep -Elà con đường để đi. Nếu không sẽ không có kết quả phù hợp. Cũng htrong lskhông phục vụ mục đích nào ở đây! -h, --human-readable : with -l, print sizes in human readable format (e.g., 1K 234M 2G). Để biết thêm xem man lshoặcman grep
ss_iwe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.