Bir dosyayı taşıyın ve arkasında yumuşak bir bağlantı bırakın


10

Bunun eşdeğerini yapmamı sağlayan tek bir linux komutu arıyorum:

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

Bir tane yoksa, bunu bir grup dosya için yapmanın en iyi yolu nedir?


Bash komut dosyası yazmak için yeterince iyi bilmiyorum, ama benim çözümüm sadece bir senaryo yazmak ve cpln gibi akılda kalıcı bir şey olarak adlandırmak olacaktır
Unkwntech

1
Cp mv olmamalı mı?
Bart van Heukelom

Hayır. -N seçeneği için -f seçeneği bununla ilgilenir.
innaM

1
10GB'lık bir dosyada deneyin
hayalci

2
Sen karıştırıyorsun @HelloGoodbye &&ile &. Yazıldığı gibi, satır cp'nin dönüş değerini kontrol eder ve sadece başarılı olursa ikinci kısmı çalıştırır.
itsadok

Yanıtlar:


7

Küçük bir not, komutun verileri gerçekten taşımamasını sağlamak için ln'yi iki kez kullanabileceğinizdir (her iki yolun da aynı dosya sisteminde olduğu varsayılarak).

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

Ama / some / path / içeriğini başka bir diske taşımak ve sonra yeni dosyalara "hiç kimse" bildirimleri oluşturmak için bağlantılar oluşturmak istediğinizi varsayıyorum.

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

Bir bash işlevinde sarma:

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

Hareket ettiğim şey bir dizin olduğunda bu çalışmanın bir yolu var mı?
tladuke

Bu, diskteki gerçek dosyayı nasıl taşır?
İbrahim

İbrahim: Veriler hareket etmiyor, sadece dizindeki işaretçileri güncelliyor.
Bay Shark

tladuke: Evet ve hayır. Dizin diskte çok daha küçük olduğundan, ln numarasına (yönetmenler için işe yaramaz) gerek yoktur, sadece bir mv yapın :-)
Mr Shark

2

Sen-ebilmek kullanma benim komut dosyası (iki parametre alır / bazı / yol / dosya ve / başka / yol /):

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

Dize manipülasyonları ile serin hile, daha önce hiç görmedim. Teşekkürler!
itsadok

1

Cidden, bunun gerçekten kolay bir soru olduğunu düşündüm.

İşte perl ne yapabilirim:

#!/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/");
}

Daha zarif bir şey umuyordum, ama sanırım bunu kullanacağım.


1
Bunu yapmak için "Perl'de" File :: Copy (veya benzeri) ve symlink () kullanmalısınız. Perl kabuk değildir; system () öğesinden kaçının ve özellikle tüm komut satırlarını system () öğesine iletmekten kaçının (örneğin, bir bağımsız değişken boşluk içeriyorsa ne olur?). Her iki durumda da, her zaman, her zaman, DAİMA dönüş değerlerini kontrol edin.
John Siracusa
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.