Tạo liên kết tượng trưng đến các tệp bằng cách sử dụng ký tự đại diện


7

Tôi muốn tạo liên kết tượng trưng cho nhiều tệp:

ln -s dev-*.php 's/dev-(.*\.php)/$1/'

Results hoped for:  
    site.php links to dev-site.php  
    file.php links to dev-file.php

Cách ngắn gọn nhất để đạt được điều này là gì?

Câu trả lời:


10

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-".


Có vẻ như trình định dạng mã không giống như định dạng $ {param # word}. Trong bối cảnh này, # không được coi là một nhận xét mà là một hướng dẫn để loại bỏ dev- khỏi giá trị được lưu trữ trong TẬP_TIN
James Thompson

Chỉ cần quan tâm với tên tệp có các ký tự ngộ nghĩnh ... và đó ${FILE#dev-}là một bashishm, AFAIU (chắc chắn không phải /bin/shtrên đường Solaris trở lại).
vonbrand

1
@vonbrand, ${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.
Stéphane Chazelas

Cảm ơn tất cả, vì sự giúp đỡ và giải thích của bạn. Thêm 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.
gbentley

5

Tôi thường sử dụng một lót ngắn gọn.

for file in dev-*.php; do ln -s $file $(echo "$file" | sed 's/^dev-//'); done

Điều này xoay vòng qua các tệp 'dev - *. Php', lấy tên mới mà không có 'dev-', sau đó tạo liên kết tượng trưng.


2

Với zsh, bạn sẽ làm:

autoload zmv # typically in ~/.zshrc
zmv -Lsv 'dev-(*.php)' '$1'

Với bashhoặ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.phptồ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.phpliên kết tượng trưng bên trong nó. Với GNU, lnbạn có thể thêm -Ttùy chọn để bảo vệ chống lại điều đó (với zmvviệc sử dụng -o -Tđể chuyển -Ttùy chọn xuống ln).

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.