एक फ़ोल्डर संरचना की प्रतिलिपि कैसे करें और फ़ाइलों के प्रतीकात्मक लिंक कैसे बनाएं?


21

मेरे पास एक फ़ोल्डर SOURCE है जिसमें कई उप-स्तरीय फ़ोल्डर हैं, जिनमें से प्रत्येक की अपनी फाइलें हैं।

मैं इस फ़ोल्डर को एक नए फ़ोल्डर कॉपी में कॉपी करना चाहता हूं जहां मुझे निर्देशिका संरचना की प्रतिलिपि बनाने की आवश्यकता है, लेकिन फाइलों को प्रतीकात्मक लिंक के रूप में SOURCE और इसके सबफ़ोल्डर्स में मूल फ़ाइलों के लिए रखना है।


1
यह भी देखें stackoverflow.com/q/1240636/905686
user905686

GNU स्टोव थोमा ऐसा करता है।
Kusalananda

जवाबों:


27

यहां गैर-एम्बेडेड लिनक्स और Cygwin पर समाधान है:

cp -as SOURCE/ COPY

ध्यान दें कि SOURCE एक पूर्ण पथ होना चाहिए और एक अनुगामी स्लैश होना चाहिए। यदि आप एक रिश्तेदार मार्ग देना चाहते हैं, तो आप उपयोग कर सकते हैं

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

सही काम करता है, धन्यवाद। बस एक नोट .. SOURCE को पूर्ण पथ के साथ दिया जाना चाहिए (COPY इसके बजाय यदि किसी व्यक्ति की इच्छा के अनुसार दिया जा सकता है)
Antonello

यदि स्रोत निर्देशिका को लगातार नए फ़ोल्डर और उनके अंदर नई फ़ाइलों के साथ अद्यतन किया जाएगा तो यह कैसे काम करेगा? क्या उनके साथ सहानुभूति सही फ़ोल्डर संरचना में गंतव्य निर्देशिका में स्वचालित रूप से बनाई जाएगी?
सेक्सीबीट जूल

@AttitudeMonger नहीं, cp जैसी कमांड केवल एक बार लिंक बनाती है (जैसा कि आप परिणाम से देख सकते हैं)। गंतव्य को स्वचालित रूप से अपडेट करने के लिए आपको परिवर्तनों के लिए स्रोत निर्देशिका की निगरानी करनी होगी।
user905686

क्या यह सापेक्ष लिंक बनाने के लिए किया जा सकता है?
बजे ctrl-alt-delor-

@richard यदि SOURCE एक सापेक्ष पथ है तो मुझे ऐसा लगता है। यह कोशिश करो और अगर यह काम नहीं करता है तो मुझे लगता है कि आप एक नया सवाल पूछना चाहते हैं। इसे हर तरह से संदर्भ दें।
रोएमा

6

मौजूदा पेड़ की छाया निर्देशिका ट्री बनाने के लिए कम से कम 2 मानक उपयोगिताओं हैं, इसलिए यहां कोड लिखने की आवश्यकता नहीं है।

सबसे पहले वहाँ lndir(1)से xutils-devपैकेज। यह फ़ाइलों के लिए सीमलिंक का उपयोग करता है। आदमी पृष्ठ से:

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

एक बेहतर विकल्प केवल cpसही विकल्पों के साथ उपयोग करना है जैसा कि स्वीकृत उत्तर बताता है। मैं बस कुछ और उपयोगी उपयोगी विवरण देता हूँ:

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

यदि आप सभी विशेषताओं (मालिकाना / अनुमतियों, समय) को संरक्षित करने के बारे में परवाह नहीं करते हैं, तो aविकल्प (समतुल्य -dr --preserve=all) को rकेवल (पुनरावर्ती ) के साथ बदलें :

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

lndirखोल स्क्रिप्ट के रूप में भी उपलब्ध है, यदि यह स्थापित नहीं है: openource.apple.com/source/X11/X11-0.46.4/lndir.sh?txt
Lenar Hoyt

2

आप इस तरह के कुछ आदेशों की कोशिश कर सकते हैं:

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

कुछ इस तरह से आप की जरूरत होगी।

#!/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

निर्देशिकाएँ लक्ष्य COPY ट्री में बनाई गई हैं। बाकी सब कुछ SOURCE पेड़ के भीतर पूर्ण पथ पर वापस सम्‍मिलित है। सुनिश्चित करें कि SOURCE और COPY दोनों को पूर्ण पथ (शुरुआत के साथ /) के रूप में निर्दिष्ट किया गया है ।

यदि आपके पास कॉपी करने के लिए एक बड़ा पेड़ है और आप प्रति-निर्देशिका प्रगति रिपोर्ट चाहते हैं, तो आप कमांड echo "$ITEM" >&2;से ठीक पहले जोड़ सकते हैं mkdir

(मैंने देखा cpऔर cpioलेकिन न तो प्रतीकात्मक लिंक के साथ स्रोत को जोड़ने के लिए एक विकल्प है।)


1
"लाइन 9 टेस्ट" टिप्पणी एआईएस पर केएचएस से संबंधित हो सकती है जो ब्रेस-संलग्न सूची को बंद करने के लिए अर्धविराम चाह रही है:{ mkdir -p "$COPY/$ITEM"; continue; }
जेफ स्कॉलर

@JeffSchaller धन्यवाद। मैंने एक kshस्क्रिप्ट नहीं लिखी ... लेकिन ऐसा लगता है कि इसके लिए bashभी आवश्यक है। फिक्सिंग
roaima

0

अगर SOURCE में खाली डायर नहीं हैं जिन्हें कॉपी करने की आवश्यकता है

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
चूंकि आप cpवैसे भी GNU मान रहे हैं , क्यों नहीं cp -as?
गिलेस एसओ- बुराई को रोकना '

0

मैं पर्ल को तोड़कर शुरू करूंगा:

#!/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::Findएक उपयोगी मॉड्यूल है जो आपको किसी निर्देशिका फ़ाइल के भीतर किसी भी फ़ाइल पर एक विशिष्ट सबरूटीन चलाने की अनुमति देता है। इस मामले में, उप यह जांचता है कि क्या यह एक निर्देशिका है - और यदि यह है, तो एक mkdirया एक फ़ाइल करता है - जिस स्थिति में यह एक सिमलिंक करता है।


-1

ऐसा लगता है कि आप उपकरण की तरह कुछ ढूंढ रहे हैं rsnapshot; यह मनमाने निर्देशिकाओं की प्रतियां बनाता है और जहां संभव हो हार्डलिंक का उपयोग करता है। (मैन पेज पर एक नज़र डालें कि क्या फिट बैठता है।)


नहीं, प्रश्न स्पष्ट रूप से सहानुभूति के लिए पूछता है और rsnapshot हार्डलिंक का उपयोग करता है (क्योंकि यह एक बैकअप उपकरण है और फ़ाइलों को स्रोत निर्देशिका से हटाए जाने पर भी रखा जाना चाहिए)।
user905686
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.