একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে কেবল নিয়মিত ফাইলগুলি অনুলিপি করুন


12

আমি ডিরেক্টরি 1 এর ডিরেক্টরি 2 কন্টেন্ট কপি করতে চাই। যাইহোক, আমি আমার ডিরেক্টরি থেকে কেবল ফাইল (এবং ডিরেক্টরি নয়) অনুলিপি করতে চাই। আমি কীভাবে এটি করতে পারি?

cp dir1/* dir2/*

তারপরে আমার কাছে এখনও ডিরেক্টরিগুলির সমস্যা আছে।

এছাড়াও, আমার সমস্ত ফাইলের কোনও এক্সটেনশন নেই, তাই কৌতুক করবে না


1
এটির সাথে এক্সটেনশনের কী কী আছে তা জানেন না।
ctrl-alt-delor

1
cp dir1/* dir2বাcp -t dir2 dir1/*
ctrl-alt-delor

@richard ডস দুনিয়া থেকে ডিরেক্টরিগুলির জন্য এক্সটেনশন ব্যবহার না করার একটি মোটামুটি প্রচলিত অভ্যাস রয়েছে যা এখনও কিছুটা অবধি বেঁচে থাকে, কিছু লোককে ধরে নিতে পারে যে যদি কোনও বিন্দু থাকে তবে এটি কোনও ডিরেক্টরি এবং বিপরীত নয়।
গিলস 'তাই খারাপ হওয়া বন্ধ করুন'

ঠিক আছে তবে এখনও সুপ্রসন্ন নয়
ctrl-alt-delor

উত্তর:


18
cp dir1/* dir2

cpস্পষ্টভাবে এটি করতে না বলা পর্যন্ত ডিরেক্টরিগুলি অনুলিপি করবে না ( --recursiveউদাহরণস্বরূপ, দেখুন man cp)।

নোট 1: cp সম্ভবত একটি অ-শূন্য স্থিতি সহ প্রস্থান করবে, তবে ফাইলগুলি যেভাবেই অনুলিপি করা হবে। এই একটি বিষয় যখন প্রস্থান কোড উপর ভিত্তি করে কমান্ড chaining হতে পারে: &&, ||, if cp -r dir1/* dir2; then ..., ইত্যাদি (ধন্যবাদ contrebis জন্য যে সমস্যা তাদের মন্তব্যে )

নোট 2 : cpশেষ প্যারামিটারটি একক ফাইলের নাম বা ডিরেক্টরি হিসাবে প্রত্যাশা করে। *টার্গেট ডিরেক্টরিটির নামের পরে সত্যই কোনও ওয়াইল্ডকার্ড থাকা উচিত নয় । dir2\*শেলের মতোই প্রসারিত হবে dir1\*। অপ্রত্যাশিত কিছু হবে ঘটতে:

  • যদি dir2খালি থাকে এবং আপনার শেল এবং সেটিংসের উপর নির্ভর করে:
    • আপনি কেবল একটি ত্রুটি বার্তা পেতে পারেন, এটি সেরা ক্ষেত্রে scenario
    • dir2/*আক্ষরিকভাবে নেওয়া হবে (নামকরণের কোনও ফাইল / ডিরেক্টরি অনুসন্ধান করা হবে *), যা সম্ভবত *উপস্থিত না থাকলে সম্ভবত একটি ত্রুটিও ঘটায়।
    • dir2/*এটা শুধু সম্পূর্ণভাবে হুকুম থেকে সরানো হবে ত্যাগ cp dir1/*। যা, প্রসারণের উপর নির্ভর করে dir1/*ডেটা এমনকি ধ্বংস করতে পারে:
      • যদি dir1/*কেবল একটি ফাইল বা ডিরেক্টরি মেলে তবে আপনি একটি ত্রুটি পাবেন cp
      • যদি dir1/*ঠিক দুটি ফাইলের সাথে মেলে তবে একটি অপরটি ( খারাপ ) দ্বারা ওভাররাইট করা হবে ।
      • যদি dir/*একাধিক ফাইলের সাথে মেলে এবং শেষ ম্যাচটি একটি হয় তবে আপনি একটি ত্রুটি বার্তা পাবেন।
      • এর শেষ ম্যাচটি যদি dir/*ডিরেক্টরি হয় তবে অন্য সমস্ত ম্যাচ এতে সরানো হবে।
  • যদি dir2খালি না থাকে তবে এটি আবার নির্ভর করে:
    • এর শেষ ম্যাচটি dir2/*যদি একটি ডিরেক্টরি হয় dir1/*এবং এর অন্য ম্যাচগুলি dir2/*সরানো হবে।
    • যদি শেষ dir2/*ফাইলটি কোনও ফাইল হয় তবে আপনি সম্ভবত একটি ত্রুটি বার্তা পাবেন, যদি না dir1/* কেবল একটি ফাইলের সাথে মেলে।

$ cp dir1/* dir2-> cp: dir1/isadir is a directory (not copied).আমার জন্য স্থিতি 1 সহ প্রস্থান করে।
contrebis

1
হ্যাঁ, এটি আমার জন্যও স্থিতি 1 দিয়ে প্রস্থান করে। তবে তারপরেও, আমি যাচাই করা প্রতিটি সিস্টেমে cpফাইলগুলি মেলানো অনুলিপি dir1/*করে: আর্ট লিনাক্স, উবুন্টু 14.04, ওপেনবিএসডি 3.9 এবং 5.5, সুএসই লিনাক্স 8.1, ফ্রিবিএসডি 6.2, সোলারিস 8, 9 এবং 10 (যেখানে cpআসলে কোড 2 সহ উপস্থিত রয়েছে)। সুতরাং এই আচরণটি নতুন নয় (এসইএসই 8.1 2002 সালের) বা এটি লিনাক্সের মধ্যেই সীমাবদ্ধ নয়। cpএকটি শূন্য-বহির্গমন কোড সহ প্রস্থান করে কারণ এটি যা বলা হয়েছিল তা সবই করতে পারে না। তার মানে এই নয় যে এটি কিছু করে না
অ্যাডেফন

3
অবশ্যই, আমি লক্ষণীয় মূল্যবান বলে মনে করেছি কারণ আপনি যদি একসাথে কমান্ডগুলি শৃঙ্খলাবদ্ধ করে থাকেন তবে &&সমস্যা হতে পারে। আমি এরকম কিছু করার চেষ্টা করছিলাম যদিও এখনকার প্রসঙ্গটি মনে করতে পারছি না।
কনট্রবিস

এটি লুকানো ফাইলগুলি অনুলিপি করে না।
22

@ ফিলউইথ *লুকানো ফাইল অন্তর্ভুক্ত কিনা বা কীভাবে লুকানো ফাইল অন্তর্ভুক্ত করা যায় তা শেলের উপর নির্ভর করে। যদি *এতে লুকানো ফাইল অন্তর্ভুক্ত না থাকে তবে আপনি সেগুলির সাথে মেলে ধরতে পারেন .*। নোট যে এই অন্তর্ভুক্ত করা হবে .এবং ..উপর bashএবং dashকিন্তু উপর zsh। এই উত্তরের প্রসঙ্গে আপনি এড়িয়ে যেতে পারেন cp dir1/* dir1/.* dir2কারণ .এবং ..এটি ডিরেক্টরি এবং অনুলিপি করা হবে না। zshএর সাথে লুকানো ফাইলগুলিও অন্তর্ভুক্ত করা যায় *(D)
আডাইফোন

7

এটি শেল যা কমান্ড নয়, ওয়াইল্ডকার্ডগুলি প্রসারিত করে। সুতরাং cp dir1/* dir2/*প্রথমে দুটি ওয়াইল্ডকার্ড প্রসারিত করে, তারপরে cpফলাফলটি কল করে। এই সব হয় না কি দৃশ্যত আশা: কিভাবে অনেক ফাইল সেখানে ইতিমধ্যেই আছে তার উপর নির্ভর করে dir2, dir2/*এক বা একাধিক যুক্তি প্রসারিত হতে পারে। কমান্ডটি cpজানে না যে এর প্রথম যুক্তিটি প্রসারণের মধ্য দিয়ে কোনটি আর্গুমেন্ট এসেছে এবং দ্বিতীয় প্যাটার্নটি প্রসারিত করে কোনটি এসেছে। এটি তার শেষ যুক্তিটিকে গন্তব্য ডিরেক্টরিটির নাম হিসাবে প্রত্যাশা করে। সুতরাং, ডিরেক্টরি থেকে সব ফাইল কপি করতে dir1ডিরেক্টরির মধ্যে dir2গত যুক্তি ডিরেক্টরির হওয়া আবশ্যক dir2:

cp dir1/* dir2

যেহেতু *সমস্ত ফাইলের সাথে মেলে, সমস্ত ফাইল cpঅনুলিপি করার চেষ্টা করে। এর মধ্যে ডিরেক্টরি রয়েছে: ডিরেক্টরিগুলি ফাইলও। এটি ডিরেক্টরিগুলি এড়িয়ে যায়, তবে একটি ত্রুটির খবর দেয়। এটি নামকৃত পাইপগুলির মতো বিশেষ ফাইলগুলির বিষয়বস্তু অনুলিপি করে (তাদের কাছে আরও ভাল কিছু লেখা ছিল, বা cpঅবরুদ্ধ হবে) ইত্যাদি etc.

কেবল নিয়মিত ফাইলগুলি অনুলিপি করতে আপনার মিলটি সীমাবদ্ধ করতে হবে। Zsh এ, আপনি তার জন্য গ্লোব যোগ্যতা ব্যবহার করতে পারেন .:

cp dir1/*(.) dir2

অন্যান্য শেলগুলিতে এটি নেই। আপনি findফাইলের ধরণের ফিল্টার করতে কমান্ডটি ব্যবহার করতে পারেন । ধরে নিই যে আপনি অ-এমবেডেড লিনাক্স বা সিগউইন চালাচ্ছেন:

find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +

লিনাক্স, ফ্রিবিএসডি এবং ওএসএক্সে:

find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2

নির্দিষ্ট করার কোনও কারণ আছে কি -maxdepth 1? এছাড়াও, গন্তব্য ডিরেক্টরিতে মূল ডিরেক্টরি শ্রেণিবিন্যাসকে পুনরাবৃত্তভাবে অনুলিপি করে সংরক্ষণ করার কোনও উপায় আছে?
আব্দুল

@ অ্যাবডুল ছাড়া -maxdepth 1, findকমান্ডটি সাব-ডিরেক্টরিতে পুনরাবৃত্তি হবে, যা এখানে পছন্দসই ছিল না। আপনি সাবডিরেক্টরি সহ পুরো ডিরেক্টরি ট্রি কপি করতে চান, এটা একটি সম্পূর্ণ ভিন্ন প্রশ্ন, এবং উত্তর অনেক বেশি সহজ হয়: cp -a dir1 dir2
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

0

উত্স থেকে গন্তব্য ডিরেক্টরিতে ফাইল অনুলিপি করতে কমান্ডটি নীচে দেওয়া হয়েছে।

  1. সোর্স ফোল্ডারে যান তারপরে কমান্ডের নীচে লিখুন:

    $ cp fileName destination directory path

উদাহরণ:

cp publichOT.sh  /data/home/useradmin
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.