Pindahkan file dan tinggalkan tautan lunak


10

Saya mencari satu perintah linux yang memungkinkan saya melakukan hal yang sama:

cp /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Jika tidak ada, apa cara terbaik untuk melakukan ini untuk banyak file?


Saya tidak tahu Bash scripting cukup baik untuk menulis, tapi solusi saya akan hanya menulis naskah dan menyebutnya sesuatu yang menarik seperti cpln
Unkwntech

1
Bukankah seharusnya cp menjadi mv?
Bart van Heukelom

Tidak. Opsi -f untuk ln menangani itu.
innaM

1
coba pada file 10GB
hayalci

2
@ HaloGoodbye Anda bingung &&dengan &. Seperti yang ditulis, baris tidak memeriksa nilai balik cp dan hanya menjalankan bagian kedua jika berhasil.
itsadok

Jawaban:


7

Catatan kecil, adalah bahwa Anda dapat menggunakan ln di kedua kali untuk membuat perintah tidak benar-benar memindahkan data (dengan asumsi kedua jalur berada pada sistem file yang sama).

ln /some/path/file /another/path/ && ln -sf /another/path/file /some/path/

Tapi saya berasumsi bahwa Anda ingin memindahkan konten / some / path / ke disk lain, dan kemudian membuat tautan ke file baru sehingga pemberitahuan "tidak ada".

for f in `ls /some/path/`; do ln /some/path/$f /another/path/ && ln -sf /another/path/$f /some/path; done

Membungkusnya dalam fungsi bash:

function cpln {
    for f in `ls $1`
    do
        ln $1/$f $2 && ln -sf $2/$f $1
    done
}

Apakah ada cara untuk membuat ini berfungsi jika apa yang saya pindahkan adalah direktori?
tladuke

Bagaimana cara memindahkan file aktual pada disk?
Ibrahim

Ibrahim: data tidak bergerak, itu hanya memperbarui petunjuk dalam direktori.
Tuan Shark

tladuke: Ya dan tidak. Karena direktori ini lebih banyak smaler pada disk, tidak perlu trik ln (yang tidak berfungsi untuk direktori), lakukan saja mv :-)
Mr Shark

2

Ada skrip saya yang dapat Anda gunakan (mengambil dua parameter / beberapa / path / file dan / lainnya / path /):

#!/bin/bash
cp $1 $2
if [ "$?" -ne "0" ]; then
    echo "Some error"
    exit 1
    fi
ln -sf $2/${1##*/} ${1%/*}

Trik keren dengan manipulasi string, tidak pernah melihat itu sebelumnya. Terima kasih!
itsadok

1

Serius, saya pikir ini adalah pertanyaan yang sangat mudah.

Inilah yang bisa saya lakukan di perl:

#!/bin/perl
# Usage: cpln TARGETDIR SOURCE...
# Example: find tree/ -type f | xargs cpln commands/

$target = shift;

foreach(@ARGV) {
    m[(.*)/([^/]+)];
    system("cp $_ $target");
    system("ln -sf $target/$2 $1/");
}

Saya berharap untuk sesuatu yang lebih elegan, tapi saya rasa saya akan menggunakannya.


1
Untuk melakukannya "di Perl," Anda harus menggunakan File :: Copy (atau yang serupa) dan symlink (). Perl bukan shell; menghindari sistem (), dan terutama menghindari meneruskan seluruh baris perintah ke sistem () (misalnya, bagaimana jika argumen berisi spasi?). Either way, selalu, selalu, SELALU memeriksa nilai pengembalian.
John Siracusa
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.