Bir klasör yapısını nasıl kopyalayabilir ve dosyalara sembolik bağlantılar kurabilirim?


21

Her biri kendi dosyaları olan birkaç alt düzey klasör içeren bir klasör SOURCE'um var.

Bu klasörü COPY klasörüne kopyalamak istiyorum, burada dizin yapısını kopyalamam gerekiyor ancak dosyaları SOURCE ve alt klasörlerinde orijinal dosyalara sembolik bağlar olarak tutmam gerekiyor.



GNU Stow bunu yapar.
Kusalananda

Yanıtlar:


27

İşte gömülü olmayan Linux ve Cygwin'deki çözüm:

cp -as SOURCE/ COPY

SOURCE'un mutlak bir yol olması ve izinde eğik çizgi olması gerektiğini unutmayın. Göreceli bir yol vermek istiyorsanız,

cp -as "$(pwd)/SOURCE/" COPY

Mükemmel çalışıyor, teşekkür ederim. Sadece bir not .. SOURCE tam yolla verilmelidir (İstenirse COPY yerine göreceli olarak verilebilir)
Antonello

Kaynak dizin sürekli olarak yeni klasörler ve içindeki yeni dosyalar ile güncellenecekse nasıl çalışır hale gelir? Hedef linkte bunlara sembolik bağlantılar otomatik olarak doğru klasör yapısında oluşturulacak mı?
SexyBeast,

@AttitudeMonger Hayır, cp gibi bir komut sadece bağlantıları bir kez oluşturur (sonuçtan görebileceğiniz gibi). Hedefi otomatik olarak güncellemek için kaynak dizini değişiklikleri izlemeniz gerekir.
user905686

Bu göreceli bağlantılar oluşturmak için yapılabilir mi?
ctrl-alt-delor,

@ richard SOURCE göreceli bir yol ise o zaman sanırım. Deneyin ve bu işe yaramazsa, yeni bir soru sormak isteyebilirsiniz. Buna elbette referans verin.
roaima

6

Mevcut bir ağacın bir gölge dizin ağacı oluşturmak için en az 2 standart yardımcı program vardır, bu nedenle buraya kod yazmanıza gerek yoktur.

İlk lndir(1)önce xutils-devpakette var. Dosyalara sembolik bağlantılar kullanır. Man sayfasından:

NAME
   lndir  -  create a shadow directory of symbolic links to another
             directory tree
SYNOPSIS
   lndir [ -silent ] [ -ignorelinks ] [ -withrevinfo ] fromdir [ todir ]

Belki de daha iyi bir alternatif, cpkabul edilen cevabın önerdiği gibi sadece doğru seçeneklerle kullanmaktır . Sadece biraz daha umarım faydalı detaylar vereceğim:

cp -al /src/dir /dest/dir    # hard-links to leaf-files
cp -as /src/dir /dest/dir    # symlinks to leaf-files

Tüm nitelikleri (mülkiyet / izinler, zamanlar) korumakla ilgilenmiyorsanız, aseçeneği (ile eşdeğerde -dr --preserve=all) ile r(sadece özyinelemeli) değiştirin:

cp -rl /src/dir /dest/dir    # hard-links to leaf-files
cp -rs /src/dir /dest/dir    # symlinks to leaf-files

lndiryüklenmediği takdirde burada bir kabuk betiği olarak da kullanılabilir: opensource.apple.com/source/X11/X11-0.46.4/lndir.sh?txt
Lenar Hoyt

2

Bunun gibi birkaç tane bulma komutunu deneyebilirsiniz:

mkdir FULL-PATH-TO-COPY
cd SOURCE
find . \( ! -regex '\.' \) -type d -exec mkdir FULL-PATH-TO-COPY/{} \;
find * -type f -exec ln -s `pwd`/{} FULL-PATH-TO-COPY/{} \;

1

Bunun gibi bir şey ihtiyacınız olanı yapacak.

#!/bin/bash
#
SOURCE="$1" COPY="$2"
cd "$SOURCE"
find . |
    sed 's!^\./!!' |
    while IFS= read ITEM
    do
        test -d "$ITEM" && { mkdir -p "$COPY/$ITEM"; continue; }
        BASE="${FILE%\/*}"
        ( cd "$COPY/$BASE" && ln -s "$SOURCE/$ITEM" )
    done

Dizinler, hedef COPY ağacında oluşturulur. Geriye kalan her şey, SOURCE ağacı içindeki mutlak yola geri çevrilir. Hem SOURCE hem de COPY öğesinin mutlak yollar olarak belirtildiğinden emin olun (ile başlar /).

Kopyalanacak büyük bir ağacınız varsa ve dizin başına ilerleme raporu istiyorsanız echo "$ITEM" >&2;, mkdirkomuttan hemen önce ekleyebilirsiniz .

(Ben baktım cpve cpiofakat ne sembolik bağlantıları ile kaynağına bağlamak için bir seçenek var gibi gözüküyor.)


1
: "Hat 9 testi" yorum ayracı kapalı listesini kapatmak için noktalı virgül isteyen AIX'te ksh ilgili olabilir{ mkdir -p "$COPY/$ITEM"; continue; }
Jeff Schaller

@JeffSchaller teşekkürler. Bir kshsenaryo yazmadım ... ama bunun için bashde gerekli gibi görünüyor . Sabitleme
roaima

0

SOURCE'da boş kopyalar yoksa kopyalanması gereken

find /full/path/to/SOURCE -type f -exec cp -t COPY --parents -s {} +
mv COPY/full/path/to/SOURCE COPY
rm -r COPY/full

1
cpZaten GNU’yu varsaydığına göre , neden olmasın cp -as?
Gilles 'SO- kötülük olmayı bırak'

0

Perl'i kırarak başlayacağım:

#!/usr/bin/perl

use strict;
use warnings;
use File::Find;

my $src_dir = "/full_path/to/dir";
my $tgt_dir = "/path/to/new/location";

sub link_or_mkdir {

    #current file is directory
    if (-d) {
        #extract the path
        my $newpath = $File::Find::dir;
        #change the path so 'old' and 'new' are swapped
        $newpath =~ s,^$src_dir,$tgt_dir,g;
        #print the command to make a new dir (doesn't actually do it)
        print "mkdir -p $newpath\n";
    }
    if (-f) {
        my $new_file = $File::Find::name;
        #change the path so 'old' and 'new' are swapped
        $new_file =~ s,^$src_dir,$tgt_dir,g;
        #print the symlink command
        print "ln -s $File::Find::name $new_file\n";
    }
}

find( \&link_or_mkdir, $tgt_dir );

File::FindBir dizin ağacındaki herhangi bir dosyada belirli bir alt yordamı çalıştırmanıza izin veren kullanışlı bir modüldür. Bu durumda, alt bir dizin olup olmadığını kontrol eder - ve eğer öyleyse, bir mkdirveya bir dosya yapar - bu durumda bir sembolik bağlantı yapar.


-1

Görünüşe göre alet gibi bir şey arıyorsun rsnapshot; isteğe bağlı dizinlerin kopyalarını oluşturur ve mümkün olduğunda hardlinks kullanır. (Uygun olup olmadığını görmek için man sayfasına bakınız.)


Hayır, soru açıkça semboliklere soruyor ve rsnapshot hardlinks kullanıyor (bir yedekleme aracı olduğu için ve dosyalar kaynak dizinden kaldırılsalar bile saklanmalı).
user905686
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.