কিছু ফোল্ডার বাদ দিয়ে পুনরাবৃত্তভাবে ফোল্ডারটি অনুলিপি করুন


197

আমি একটি সাধারণ বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি যা লুকানো ফাইল এবং ফোল্ডার সহ কোনও ফোল্ডারের পুরো বিষয়বস্তু অন্য ফোল্ডারে অনুলিপি করবে, তবে আমি নির্দিষ্ট নির্দিষ্ট ফোল্ডারগুলি বাদ দিতে চাই। আমি কীভাবে এটি অর্জন করতে পারি?


1
আমি খুঁজে পেতে মত কিছু কল্পনা। -নম * আপনি চান না এমনগুলি ফিল্টার করতে গ্রেপ / ভি "" বাদ দিন-প্যাটার্ন "এ পাইপ করুন এবং অনুলিপিটি করার জন্য সিপিতে পাইপ করুন।
i_am_jorf

1
আমি এরকম কিছু করার চেষ্টা করছিলাম, তবে পাইপ দিয়ে সিপি কীভাবে ব্যবহার করব তা বুঝতে
পারছিলাম না

1
এটি সম্ভবত সুপার ব্যবহারকারীর কাছে যাওয়া উচিত। আপনি যে আদেশটি সন্ধান করছেন তা হ'ল xargs gs আপনি পাইপের মাধ্যমে সংযুক্ত দুটি টারের মতো কিছু করতেও পারেন।
কাইল বাট

1
সম্ভবত এটির দেরী হয়ে গেছে এবং এটি প্রশ্নের সঠিক উত্তর দিতে পারে না তবে এখানে একটি পরামর্শ: আপনি যদি কেবলমাত্র ডিরেক্টরিটির তাত্ক্ষণিক শিশুদের বাদ দিতে চান তবে আপনি বাশ প্যাটার্ন মিলের সুবিধা নিতে পারেন, যেমনcp -R !(dir1|dir2) path/to/destination
বরিস ডি তেওহরভ

1
নোট করুন যে !(dir1|dir2)প্যাটার্নটি extglobচালু করতে হবে ( shopt -s extglobএটি চালু করতে)।
বরিস ডি তেওহরভ

উত্তর:


334

Rsync ব্যবহার করুন:

rsync -av --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

নোট করুন যে ব্যবহার sourceএবং source/পৃথক। একটি পিছনে স্ল্যাশ মানে ফোল্ডারের সামগ্রীগুলিকে অনুলিপি sourceকরা destination। পেছনের স্ল্যাশ ছাড়া এটির অর্থ ফোল্ডারে অনুলিপি sourceকরা destination

বিকল্পভাবে, যদি আপনার বাদ দেওয়ার জন্য প্রচুর ডিরেক্টরি (বা ফাইল) থাকে তবে আপনি ব্যবহার করতে পারেন --exclude-from=FILE, যেখানে FILEফাইল বা ডিরেক্টরিগুলি অন্তর্ভুক্ত করার কোনও ফাইলের নাম নেই।

--exclude এছাড়াও ওয়াইল্ডকার্ড থাকতে পারে --exclude=*/.svn*


10
কোন ফাইলগুলি অনুলিপি করা হচ্ছে তা যাচাই করার জন্য আমি - ড্রাই-রান যুক্ত করার পরামর্শ দিই।
loretoparisi

1
@ আমোকহগিনসন - আপনি কোন সিস্টেম ব্যবহার করছেন? আরআইএইচএল, সেন্টস, ডেবিয়ান এবং উবুন্টু সহ আমি জানি যে সমস্ত মূলধারার লিনাক্স ডিস্ট্রোগুলিতে রাইকিঙ্ক ডিফল্টরূপে অন্তর্ভুক্ত রয়েছে এবং আমি বিশ্বাস করি এটি ফ্রিবিএসডি-তেও রয়েছে।
সিলিকনরোক স্টার

1
আরএইচএল এর জন্য ড্রেসড ডিস্ট্রোস: ইয়াম ইনস্টল আরএসসিএনসি বা ডিবিয়ান-ভিত্তিক রিলিজ: অ্যাপট-গেট ইনস্টল আরএসসিএনসি। আপনি যদি নিজের সার্ভারকে আপনার নিজের হার্ডওয়্যারে পরম বেস থেকে তৈরি না করেন তবে এটি একটি ইস্যু নয়। আর এসআইএনসিটি আমার অ্যামাজন ইসি 2 বাক্সগুলিতে এবং জিরোলাগ এবং র্যাকস্পেস থেকে আমার বাক্সগুলিতে ডিফল্টরূপে ইনস্টল করা আছে।
সিলিকনরোকস্টার

2
সিএসপির তুলনায় আরএসআইএনসি অত্যন্ত ধীর বলে মনে হচ্ছে? কমপক্ষে এটি আমার অভিজ্ঞতা ছিল।
কোজো

2
উদাহরণস্বরূপ গিট দির উপেক্ষা:rsync -av --exclude='.git/' ../old-repo/ .
nycynik

40

একটি পাইপ সহ টার ব্যবহার করুন।

cd /source_directory
tar cf - --exclude=dir_to_exclude . | (cd /destination && tar xvf - )

এমনকি আপনি এই কৌশলটি ssh জুড়ে ব্যবহার করতে পারেন।


এই পদ্ধতির অযৌক্তিকভাবে প্রথমে লক্ষ্য উত্সটি ছিন্ন করা হয় (এবং সংরক্ষণাগারে নির্দিষ্ট ডিরেক্টরিগুলি অন্তর্ভুক্ত করা হয়) এবং তারপরে এটি লক্ষ্যবস্তুতে অনাবৃত হয়। প্রস্তাবিত নয়!
ওয়াউটার ডন্ডার্স

4
@ ওয়ালধেরি আপনি ভুল বলেছেন এটিই সেরা সমাধান। এটি ওপি যা অনুরোধ করেছিল ঠিক তাই করে এবং এটি ওএসের মতো * নিক্সের বেশিরভাগ ডিফল্ট ইনস্টলটিতে কাজ করে। কোনও ফাইল সিস্টেমের আর্টফ্যাক্ট (মেমরির ক্ষেত্রে) ছাড়াই উড়ে বেড়ানো এবং অপরিবর্তনীয় কাজ করা হয়, এই টার + আনতারের দাম নগণ্য।
AmokHuginnsson

@ ওয়াটারডন্ডার্স টার ন্যূনতম ওভারহেড। এটি সংকোচন প্রয়োগ করে না।
কাইল বাট

9

আপনি ব্যবহার করতে পারেন findসঙ্গে -pruneবিকল্প।

এর একটি উদাহরণ man find:

       সিডি / উত্স-দির
       অনুসন্ধান . -নেম .স্নাপশট -প্রুন -o \ (\! -নম * ~ -প্রিন্ট0 \) |
       সিপিও-পিএমডি0 / ডেসট-ডির

       এই কমান্ডটি / উত্স-ডিরের বিষয়বস্তুগুলি / গন্তব্য-দিরের অনুলিপি করে, তবে বাদ দেয়
       .snapshot (এবং এর মধ্যে কিছু) নামক ফাইল এবং ডিরেক্টরি। এটাও
       ফাইল বা ডিরেক্টরি বাদ দেয় যার নাম ~ এ শেষ হয় তবে তাদের শঙ্কু নয়
       তাঁবু। কনস্ট্রাক্ট-প্রুন---(... -প্রিন্ট0 \) বেশ সাধারণ। দ্য
       এখানে ধারণাটি হ'ল -প্রিনেশনের পূর্বে প্রকাশটি যা জিনিসগুলির সাথে মেলে
       ছাঁটাই করা। তবে, কর্ম-কর্মটি নিজেই সত্য হয়, তাই
       নিম্নলিখিত -o নিশ্চিত করে যে ডান হাতটি কেবল মূল্যায়নের জন্য
       যে ডিরেক্টরিগুলি ছাঁটাই হয়নি (ছাঁটাইয়ের সামগ্রীগুলি)
       ডিরেক্টরিগুলি এমনকি পরিদর্শন করা হয় না, সুতরাং তাদের বিষয়বস্তু অপ্রাসঙ্গিক)।
       -ও এর ডান হাতের এক্সপ্রেশনটি কেবল প্রথম বন্ধনে রয়েছে
       স্বচ্ছতার জন্য. এটি জোর দেয় যে -প্রিন্ট 0 ক্রিয়াটি কেবলমাত্র ঘটে
       যে বিষয়গুলিতে তাদের জন্য প্রুনা-প্রযোজ্য ছিল না তার জন্য। কারন
       ডিফল্ট `এবং 'পরীক্ষার মধ্যে শর্তটি -o এর চেয়ে আরও শক্ত করে বেঁধে দেয়
       যাইহোক, এটি ডিফল্ট তবে প্যারেন্টেসিসগুলি যা চলছে তা দেখাতে সহায়তা করে
       চালু.

সরাসরি ম্যানপেজ থেকে একটি অত্যন্ত প্রাসঙ্গিক উদাহরণ সনাক্ত করার জন্য প্রপস।
ডেভিড এম

দেখতে অনেক ভাল লাগছে! এটি অনলাইন ডক্সেও উপলব্ধ । দুর্ভাগ্যক্রমে cpioএখনও এমএসওয়াইএস 2 এর জন্য প্যাকেজ করা হয়নি।
আন্ডারস্কোর_ডি

3

আপনি - এক্সক্লুড অপশন সহ টার ব্যবহার করতে পারেন এবং তারপরে এটি গন্তব্যে অনার্স করুন। যেমন

cd /source_directory
tar cvf test.tar --exclude=dir_to_exclude *
mv test.tar /destination 
cd /destination  
tar xvf test.tar

আরও তথ্যের জন্য টারের ম্যান পৃষ্ঠা দেখুন


2

জেফের ধারণার অনুরূপ (অনির্ধারিত):

find . -name * -print0 | grep -v "exclude" | xargs -0 -I {} cp -a {} destination/

দুঃখিত, তবে কেন সত্যই আমি পাই না যে যখন 5 জন লোক এটিকে উপস্থাপন করেছিল যখন এটি স্বীকৃতভাবে অনির্ধারিত ছিল /usr/share/iconsএবং কোনও সাধারণ পরীক্ষায় কাজ করছে বলে মনে হয় না: আমি এটির একটি সাবডিরে চেষ্টা করেছিলাম find: paths must precede expression: 22x22এবং ততক্ষণে সেখানে পৌঁছে গেলাম যেখানে সেখানে সাবডিরদের একজন is । আমার কমান্ডটি ছিল find . -name * -print0 | grep -v "scalable" | xargs -0 -I {} cp -a {} /z/test/(স্বীকার হয়েছে, আমি এমএসওয়াইএস 2 তে আছি, তাই আসলেই /mingw64/share/icons/Adwaita, কিন্তু এমএসওয়াইএস 2 এর কী দোষ তা আমি দেখতে পাচ্ছি না)
আন্ডারস্কোর_

0
EXCLUDE="foo bar blah jah"                                                                             
DEST=$1

for i in *
do
    for x in $EXCLUDE
    do  
        if [ $x != $i ]; then
            cp -a $i $DEST
        fi  
    done
done

অপরীক্ষিত ...


এটি ভুল। কয়েকটি সমস্যা: লিখিত হিসাবে, এটি এমন একটি ফাইল অনুলিপি করবে যা একাধিকবার বাদ পড়ার কথা নয় (এই বিষয়গুলিতে 4 যা বাদ দেওয়া হবে এমন আইটেমের সংখ্যা)। এমনকি আপনি বাদ দেওয়া তালিকার প্রথম আইটেম 'foo' অনুলিপি করার চেষ্টা করেও, আপনি x = বারে উঠলে এটি অনুলিপি করা হবে এবং আমি তখনও ভুগছি। আপনি যদি প্রাক-বিদ্যমান সরঞ্জামগুলি (উদাহরণস্বরূপ rsync) ব্যতীত এটি করার জন্য জেদ করেন, তবে অনুলিপিটি 'এক্স ইন ...' লুপের বাইরে যদি একটি বিবৃতিতে সরিয়ে নিন এবং 'এক্স ...' লুপটিকে লজিক্যাল স্টেটমেন্ট পরিবর্তন করুন যদি (সত্য) অনুলিপি ফাইল। এটি আপনাকে একাধিকবার অনুলিপি করা থেকে বিরত করবে।
এরিক পুওলি

0

@ স্টিভলাজারিডিসের উত্তর দ্বারা অনুপ্রাণিত, যা ব্যর্থ হবে, এখানে একটি পসিক্স শেল ফাংশন রয়েছে - কেবল cpxআপনার নামক কোনও ফাইল অনুলিপি করুন এবং $PATHএটি কার্যকর করুন ( chmod a+x cpr) করুন। [উত্স এখন আমার গিটল্যাবটিতে রক্ষণাবেক্ষণ করা হচ্ছে ।

#!/bin/sh

# usage: cpx [-n|--dry-run] "from_path" "to_path" "newline_separated_exclude_list"
# limitations: only excludes from "from_path", not it's subdirectories

cpx() {
# run in subshell to avoid collisions
  (_CopyWithExclude "$@")
}

_CopyWithExclude() {
  case "$1" in
    -n|--dry-run) { DryRun='echo'; shift; } ;;
  esac

  from="$1"
  to="$2"
  exclude="$3"

  $DryRun mkdir -p "$to"

  if [ -z "$exclude" ]; then
      cp "$from" "$to"
      return
  fi

  ls -A1 "$from" \
    | while IFS= read -r f; do
        unset excluded
        if [ -n "$exclude" ]; then
          for x in $(printf "$exclude"); do
          if [ "$f" = "$x" ]; then
              excluded=1
              break
          fi
          done
        fi
        f="${f#$from/}"
        if [ -z "$excluded" ]; then
          $DryRun cp -R "$f" "$to"
        else
          [ -n "$DryRun" ] && echo "skip '$f'"
        fi
      done
}

# Do not execute if being sourced
[ "${0#*cpx}" != "$0" ] && cpx "$@"

ব্যবহারের উদাহরণ

EXCLUDE="
.git
my_secret_stuff
"
cpr "$HOME/my_stuff" "/media/usb" "$EXCLUDE"

কারও উত্তর এটির সাথে কী ভুল আছে এবং কীভাবে আপনি এটি ঠিক করেছেন তা ব্যাখ্যা না করেই "ব্যর্থ হবে" তা বলা অসম্পূর্ণ বলে মনে হচ্ছে ...
আন্ডারস্কোর_

@ মাউন্ডস_ডি: সত্যই, অন্ধকারে, এএসপি হিসাবে এখন আমি কী ব্যর্থ তা মনে করতে পারছি না :-(
go2null

একাধিক জিনিস: (1) এটি একাধিকবার ফাইলগুলি অনুলিপি করে এবং (২) যুক্তিটি এখনও ফাইলগুলি বাদ না করে অনুলিপি করে। I = foo ব্যবহার করে লুপগুলি চালান: এটি অন্য কোনও ফাইল যেমন i = test.txt এর জন্য 4 এর পরিবর্তে 3 বার অনুলিপি করা হবে।
এরিক পুওলি

1
স্টিভের উত্তরের ভুলত্রুটি পরিষ্কার করার জন্য @ এরিকব্রিংলি ধন্যবাদ! (আল্লাহ বলবেনঃ এটা ছিল না অপরীক্ষিত যদিও।)
go2null
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.