Saya ingin mengonversi tautan lunak menjadi tautan keras di direktori secara rekursif. Saya sudah mencoba sesuatu seperti ini:
for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done
... tetapi memiliki dua masalah utama:
- tidak rekursif
- mengambil file yang bukan tautan simbolis
Akan lebih baik untuk memberi makan entah bagaimana baris di atas find -type l
, tapi saya tidak yakin bagaimana melakukannya.
bash
find
symbolic-link
Attila O.
sumber
sumber
cp -aH
). [1]: unix.stackexchange.com/questions/94185/…Jawaban:
Perintah ini harus bekerja:
Bagaimana itu bekerja:
find -type l
menemukan semua tautan di direktori saat ini.-exec bash -c '...' {} \;
memanggil bash untuk dieksekusi...
.Itu lewat
{}
- nama tautan yang saat ini sedang diproses - sebagai argumen, yang dapat diakses oleh bash$0
.readlink -m "$0"
mengembalikan jalur absolut dari tujuan tautan simbolik.ln -f "$(readlink -m "$0")" "$0"
menimpa (-f
) tautan simbolik$0
dengan tautan keras ke targetnya.Jika tautan tidak dapat dikonversi karena alasan tertentu, tautan itu akan tetap tidak tersentuh dan ln akan mencetak pesan kesalahan.
sumber
bash
danln
?-e
saklar memperbaikinya.brew install coreutils
danfind * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
.