ফোল্ডারের কাঠামোটি কীভাবে অনুলিপি করবেন এবং ফাইলগুলিতে প্রতীকী লিঙ্কগুলি করবেন?


21

আমার কাছে একটি ফোল্ডার রয়েছে SOURCE এতে বেশ কয়েকটি সাব-লেভেল ফোল্ডার রয়েছে যার প্রত্যেকটির নিজস্ব ফাইল রয়েছে।

আমি এই ফোল্ডারটি একটি নতুন ফোল্ডারে কপি করতে চাই যেখানে কপিরাইট করতে হবে যেখানে আমাকে ডিরেক্টরি কাঠামোটি অনুলিপি করতে হবে তবে ফাইলগুলি SOURCE এবং এর সাবফোল্ডারগুলিতে মূল ফাইলগুলির প্রতীকী লিঙ্ক হিসাবে রাখতে হবে।



জিএনইউ স্টো কিন্ডা এটি করে।
কুসালানন্দ

উত্তর:


27

এম্বেডবিহীন লিনাক্স এবং সাইগউইনের সমাধান এখানে:

cp -as SOURCE/ COPY

মনে রাখবেন যে SOURCE অবশ্যই একটি পরম পথ হতে হবে এবং তার একটি শেষ ট্র্যাশ থাকতে হবে। আপনি যদি কোনও আপেক্ষিক পথ দিতে চান তবে আপনি ব্যবহার করতে পারেন

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

নিখুঁত কাজ করে, আপনাকে ধন্যবাদ। কেবল একটি নোট .. সম্পূর্ণ পথ দিয়ে উত্স দিতে হবে (তার ইচ্ছা থাকলে তুলনামূলক শর্তে কপি দেওয়া যেতে পারে)
এন্টোনেলো

কীভাবে এটি কাজ করবেন যদি উত্স ডিরেক্টরিটি তাদের ভিতরে নতুন ফোল্ডার এবং নতুন ফাইলগুলির সাথে নিয়মিত আপডেট হয়? সঠিক ফোল্ডার কাঠামোয় সেগুলি থেকে গন্তব্য ডিরেক্টরিতে সিমেলিঙ্কগুলি স্বয়ংক্রিয়ভাবে তৈরি হবে?
সেক্সিবিস্ট

@ অ্যাটিটিউডমঞ্জার নো, সিপির মতো একটি কমান্ড কেবল একবার লিঙ্কগুলি তৈরি করে (যেমন আপনি ফলাফল থেকে দেখতে পারেন)। গন্তব্যটি স্বয়ংক্রিয়ভাবে আপডেট করতে আপনাকে পরিবর্তনের জন্য উত্স ডিরেক্টরিটি পর্যবেক্ষণ করতে হবে।
ব্যবহারকারী 905686

এটি কি আপেক্ষিক লিঙ্কগুলি তৈরি করার জন্য করা যেতে পারে?
ctrl-alt-delor

@ রিচার্ড যদি 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এটি ইনস্টল না হওয়ার ক্ষেত্রে এখানে শেল স্ক্রিপ্ট হিসাবেও পাওয়া যায়: opensource.apple.com/source/X11/X11-0.46.4/lndir.sh?txt
লেনার হোয়েট

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 পরীক্ষা" মন্তব্যে ব্রেস-আবদ্ধ তালিকাটি বন্ধ করতে একটি সেমিকোলন চায় এমন এআইএক্স-এর ksh সম্পর্কিত হতে পারে:{ mkdir -p "$COPY/$ITEM"; continue; }
জেফ শ্যাচলার

@ জেফ শ্যাচলার ধন্যবাদ। আমি কোনও kshস্ক্রিপ্ট লিখিনি ... তবে দেখে মনে হচ্ছে bashএটিও খুব দরকার। ফিক্সিং
রোয়াইমা


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; এটি স্বেচ্ছাসেবী ডিরেক্টরিগুলির অনুলিপি তৈরি করে এবং যেখানে সম্ভব সেখানে লিঙ্কগুলি ব্যবহার করে। (এটি মানানসই কিনা তা দেখতে ম্যান পৃষ্ঠাটি দেখুন)


না, প্রশ্নটি স্পষ্টভাবে সিমলিংকগুলির জন্য জিজ্ঞাসা করে এবং আরএসএন্যাপশট হার্ডলিংকগুলি ব্যবহার করে (কারণ এটি একটি ব্যাকআপ সরঞ্জাম এবং ফাইলগুলি উত্স ডিরেক্টরি থেকে সরানো হলেও তাদের রাখা উচিত)।
ব্যবহারকারী 905686
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.