Sửa lỗi 'ln: failed to create symbolic link: File exists' trên Linux

beginner🐧 Linux2026-05-06| Linux (Ubuntu, Debian, CentOS, Arch) — bất kỳ shell nào dùng lệnh ln

Error Message

ln: failed to create symbolic link '/usr/local/bin/node': File exists
#ln#symlink#symbolic-link#filesystem

Lỗi Gặp Phải

ln: failed to create symbolic link '/usr/local/bin/node': File exists

Bạn chạy lệnh ln -s để tạo symlink và gặp lỗi này. Có gì đó đang chiếm dụng đường dẫn đích — một file, một thư mục, hoặc một symlink cũ trỏ vào chỗ không còn tồn tại. ln sẽ không tự ghi đè trừ khi bạn chỉ định rõ ràng.

Nguyên Nhân

Đường dẫn đích (/usr/local/bin/node trong trường hợp này) đã bị chiếm. Một số tình huống thường gặp:

  • Bạn đã cài cùng một công cụ hai lần bằng các phương pháp khác nhau — chẳng hạn nvm cùng với package manager của hệ thống
  • Một symlink còn sót lại từ lần cài cũ vẫn đang tồn tại
  • Một script cài đặt chạy lại mà không dọn dẹp trước
  • Một file nhị phân thật sự — không phải symlink — đang tồn tại ở đúng đường dẫn đó

Bước 1 — Kiểm Tra Xem Có Gì Ở Đó

Chưa cần làm gì vội. Trước tiên hãy xem bạn đang đối mặt với cái gì:

ls -la /usr/local/bin/node

Ba trường hợp có thể xảy ra:

# Symlink hợp lệ đang trỏ đến đúng chỗ
lrwxrwxrwx 1 root root 30 Mar 12 2024 /usr/local/bin/node -> /home/user/.nvm/versions/node/v20.0.0/bin/node

# Symlink bị hỏng (đích đã bị xóa)
lrwxrwxrwx 1 root root 30 Mar 12 2024 /usr/local/bin/node -> /home/user/.nvm/versions/node/v18.0.0/bin/node

# Một file nhị phân thật sự
-rwxr-xr-x 1 root root 89654312 Jan 5 10:22 /usr/local/bin/node

Với symlink, hãy xác nhận đích vẫn còn tồn tại:

readlink -f /usr/local/bin/node

Không có output hoặc đường dẫn không tồn tại? Symlink đã bị hỏng. Có thể thay thế an toàn.

Bước 2 — Ghi Đè Bằng -sf

Cách nhanh nhất: cờ -f sẽ xóa thứ đang ở đó và tạo symlink mới chỉ trong một lệnh.

ln -sf /path/to/new/target /usr/local/bin/node

-s = symbolic, -f = ghi đè bắt buộc. Ví dụ cụ thể với nvm Node v20.11.0:

ln -sf /home/user/.nvm/versions/node/v20.11.0/bin/node /usr/local/bin/node

Cần quyền root? Thêm sudo vào trước:

sudo ln -sf /home/user/.nvm/versions/node/v20.11.0/bin/node /usr/local/bin/node

Bước 3 — Xóa Thủ Công Rồi Tạo Lại (Khi -f Không Đủ)

Có một trường hợp -f không giúp được: khi đích là một thư mục. Hãy xóa thủ công trước.

# Xác nhận kiểu của nó
file /usr/local/bin/node

# Xóa file hoặc symlink
sudo rm /usr/local/bin/node

# Bây giờ tạo symlink
sudo ln -s /path/to/target /usr/local/bin/node

Nếu là thư mục, dùng lệnh xóa phù hợp:

# Thư mục rỗng
sudo rmdir /usr/local/bin/node

# Thư mục không rỗng (kiểm tra kỹ trước khi chạy)
sudo rm -r /usr/local/bin/node

sudo ln -s /path/to/target /usr/local/bin/node

Bước 4 — Xác Nhận Kết Quả

Ba lệnh kiểm tra nhanh để xác nhận mọi thứ đã hoạt động đúng:

ls -la /usr/local/bin/node
readlink -f /usr/local/bin/node
node --version

Cả ba phải khớp nhau. Kết quả mong đợi:

lrwxrwxrwx 1 root root 52 May  5 02:14 /usr/local/bin/node -> /home/user/.nvm/versions/node/v20.11.0/bin/node
/home/user/.nvm/versions/node/v20.11.0/bin/node
v20.11.0

Khi Hai Bản Cài Đặt Tranh Giành Cùng Một Đường Dẫn

nvm và apt đều muốn sở hữu /usr/local/bin/node. Chúng sẽ liên tục xung đột nhau. Giải pháp gọn nhất: chọn một cái và gỡ bỏ cái kia.

# Ubuntu/Debian — gỡ bỏ package hệ thống
sudo apt remove nodejs

# CentOS/RHEL
sudo dnf remove nodejs

Để nvm tiếp quản từ đó. Hoặc giữ lại package hệ thống và trỏ lại symlink đến nơi nó cài file nhị phân:

which node   # Tìm vị trí thật sự của binary hệ thống
sudo ln -sf $(which node) /usr/local/bin/node

Dọn Dẹp Nhiều Symlink Hỏng Cùng Lúc

Script cài đặt bị lỗi? Có thể có nhiều hơn một symlink hỏng cần xử lý. Tìm tất cả chúng trước:

# Liệt kê tất cả symlink hỏng trong /usr/local/bin
find /usr/local/bin -maxdepth 1 -type l ! -exec test -e {} \; -print

Xem xét danh sách trước khi xóa bất cứ thứ gì. Sau đó trỏ lại hoặc xóa tùy theo nhu cầu.

Cách Phòng Tránh Về Sau

  • Mặc định dùng -sf trong script, không dùng -s đơn thuần. Cách này idempotent — chạy lại script sẽ không bị lỗi vì link đã tồn tại.
  • Kiểm tra trước khi tạo link: thêm [ -e "$target" ] && rm "$target" trước lệnh ln trong script cài đặt.
  • Chỉ dùng một package manager cho mỗi công cụ. Trộn lẫn nvm + apt cho Node (hoặc pyenv + pip cho Python) chính là cách bạn quay lại vấn đề này.
  • Trên hệ thống Debian, dùng update-alternatives cho các công cụ có nhiều phiên bản — nó quản lý symlink thay bạn:
sudo update-alternatives --install /usr/bin/node node /usr/local/bin/node 100

Related Error Notes