Câu trả lời:
Chà, nếu tất cả nằm trong cùng một thư mục, bạn có thể làm một cái gì đó như thế này trong bash hoặc bất kỳ shell Bourne-style / POSIX nào khác:
for FILE in dev-*; do ln -s "$FILE" "${FILE#dev-}"; done
sẽ tạo liên kết tượng trưng mà không có "dev-" cho các tệp bắt đầu bằng "dev-".
${FILE#dev-}
là một bashishm, AFAIU (chắc chắn không phải /bin/sh
trên đường Solaris trở lại).
${FILE#dev-}
không phải Bourne, mà là POSIX (được giới thiệu bởi ksh, không phải bash). Bạn cần --
cho ln
để đánh dấu sự kết thúc tùy chọn cho một *
mô hình, hoặc tốt hơn, sử dụng một dev-*
mô hình. Mã vì nó sẽ tạo ra các liên kết tượng trưng cho chính chúng trong mọi thư mục con của thư mục hiện tại có tên không bắt đầu bằng dev-
. Xem thêm các ghi chú trong câu trả lời của tôi.
dev-*
thay vì *
làm việc như dự định ở đây - vì mã đứng trên nó cố gắng tạo liên kết tượng trưng cho mọi tệp.
Với zsh
, bạn sẽ làm:
autoload zmv # typically in ~/.zshrc
zmv -Lsv 'dev-(*.php)' '$1'
Với bash
hoặc các vỏ POSIX khác (bao gồm zsh
):
for f in dev-*.php; do
ln -s "$f" "${f#dev-}"
done
Lưu ý rằng nếu site.php
tồn tại và là một thư mục (hoặc một liên kết tượng trưng đến một thư mục), thì bạn có thể kết thúc với một dev-site.php
liên kết tượng trưng bên trong nó. Với GNU, ln
bạn có thể thêm -T
tùy chọn để bảo vệ chống lại điều đó (với zmv
việc sử dụng -o -T
để chuyển -T
tùy chọn xuống ln
).