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?

itsadok
sumber
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
}
Tuan Shark
sumber
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%/*}
Kazimieras Aliulis
sumber
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.

itsadok
sumber
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