Soru Linux / Unix'te “abc” ile başlayan dizinler nasıl kopyalanır?


Bir dizinim var ~/plugins/ İçinde çok sayıda alt dizin var. Sadece alt dizinlerin bir kısmının bir yedeğini oluşturmak istiyorsam, abc Bunu bir satır kopyalama komutuyla yapabilir miyim? Böyle bir şeyin işe yarayacağını varsayardım (ama değil):

cp -R ~ / eklentileri / abc * ~ / hedef /

Mümkünse tek satırlık bir komut kullanmayı tercih ederim, çünkü rsync için aynı sözdizimini kullanmak istiyorum ve eğer

~ / plugins / -type d -name "abc *" -exec cp -R {} ~ / destination;

o zaman bu iyi çalışıyor cp Komut, ancak her dizin için bir kez rsync çalıştırmak zorunda ve sadece verimli görünmüyor anlamına gelir :(


37
2018-03-11 16:14


Menşei


Neden senin için çalışmıyor? Test ettim ve işe yaradı. Alt dizinler aracılığıyla tekrarlı geçişe mi ihtiyacınız var? - Daniel Böhmer


Cevaplar:


Neden çalıştığını neden işe yaramadı (ama "kopya" komutu nedir?), Ama bu Linux üzerinde en azından çalışır:

cp -r ~/plugins/abc* ~/destination

55
2018-03-11 16:22



Geçmeden önce yıllarca kullanmıştım. Bu kopya komutudur. Tekrar deneyeceğim ve çalışıp çalışmadığını göreceğim :) - cwd


İşte hala sık kullandığım eski bir numara:

 (cd ~/plugins/ && tar cfp - abc/) | (cd ~/destination && tar xfpv -)

nerede p özellikleri korur ve ~/destination herhangi bir yerde olabilir.


5
2018-03-11 16:17



Eski okul unix için +1 :) - MLH


Çıkışını kullanmak mümkündür find ile rsync:

# warning: untested
find ~/plugins/ -type d -name "abc*" -print0 | rsync -av --files-from=- --from0 ~/plugins/ ~/destination
  • -print0 içinde find, ve --from0 içinde rsync Dosyaları boşluklarla doğru şekilde işlediğimizden emin olur
  • --files-from=- stdin'den bir dosya listesi okuduğumuzu belirtir

1
2018-03-11 16:23



Bu oldukça havalı bir numara! - cwd


#!/usr/bin/env perl
# copie un fichier avec l'arbo
#
#
use File::Basename;
use File::Copy;
my $source = shift;
my $dest = shift;
if( !defined $source){ print "Manque fichier source"; exit(0); }
if( !defined $dest){ print "Manque repertoire dest"; exit(0); }

my $dir = dirname($source);
my $file = basename($source);

my @arbo = split(/\//, $dir);
my $direct  = $dest;
if( !-d $direct ) { mkdir $direct; }
foreach my $d(@arbo) {
        $direct.="/".$d;
        if( !-d $direct ) { mkdir $direct; }
}
copy($source,$direct);

bu kod snippet'ini örneğin copyfile olarak adlandırın

TEST: kullanım: ./copyfile


0
2018-03-08 11:30



ingilizce konuşanlar için not: "arbo" görünüşte kısa "arborescence" için (aka "ağaç yapısı") - james turner