অনুলিপি অনুলিপি (সিপি) কমান্ড ক্রিয়া


14

আমি টার্মিনালে বেলো কমান্ড লাইন ব্যবহার করে উত্স ফোল্ডার থেকে কিছু ফাইল গন্তব্য ফোল্ডারে অনুলিপি করেছি।

sudo cp From_SOURCE/* To_DESTINATION/

এখন আমি এই আদেশটি পূর্বাবস্থায় ফিরিয়ে আনতে চাই।


আমি নিশ্চিত যে আমি বুঝতে পারি না। কেবল অনুলিপি সরাবেন? (sudo আরএম ফাইল)
জ্যাকব ভিলিজ

@ জ্যাকবভিলিজম এটি কোনও পৃথক কমান্ডের কাজটিকে পূর্বাবস্থায় ফেরান না। আমি যদি অনুলিপি না করি তবে আমি আপনার প্রস্তাবিত আদেশটি আগে ব্যবহার করতে পারি। এবং অনুলিপি করা 1000 টিরও বেশি ফাইল মুছতে আমার এই আদেশটি ব্যবহার করতে হবে?
нιηসнιη

@ ক্যাসিয়া - একটি বিকল্প হ'ল যে সমস্ত ফাইলের নাম নির্বাচন করা হয়েছিল From_SOURCE/*সেগুলি সন্ধান করা এবং সেগুলি থেকে অপসারণ করা To_DESTINATION/; এটি বাশ দিয়ে করা যেতে পারে - এখানে সমস্যাগুলি সিপি কমান্ডের যে কোনও কিছুকে ওভাররোট করতে পারে, সিমলিংকগুলি অনুলিপি করা হয়েছিল, নামগুলির ফাঁকা স্থান সহ ফাইল ইত্যাদি - যাতে এতে সমস্যা হতে পারে এবং কিছুটা অসচেতন হতে পারে। একটি নিখুঁত 'পূর্বাবস্থায়' বিকল্পের জন্য প্রচুর স্টাফের জন্য অ্যাকাউন্ট করতে হবে।
উইল্ফ

উত্তর:


13

আমি যদি ভালভাবে বুঝতে পারি তবে নিম্নলিখিত বিষয়গুলি হল:

  • আপনি বিদ্যমান ডিরেক্টরিতে একটি (সম্ভবত বৃহত) সংখ্যক ফাইল অনুলিপি করেছেন এবং আপনার প্রয়োজন / ক্রিয়াকে বিপরীত করতে চান।
  • লক্ষ্যবস্তু ডিরেক্টরিতে অন্যান্য ফাইল রয়েছে যা আপনার সেখানে রাখা উচিত যা ডিরেক্টরি থেকে সমস্ত ফাইল সরিয়ে ফেলা অসম্ভব করে তোলে

নীচের স্ক্রিপ্টটি মূল (উত্স) ডিরেক্টরিতে দেখায় এবং সেই ফাইলগুলি তালিকাভুক্ত করে। তারপরে এটি যে ডিরেক্টরিতে আপনি ফাইলগুলি অনুলিপি করেছেন তাতে এটি সন্ধান করে এবং উত্স ডিরেক্টরিতে বিদ্যমান তালিকাভুক্ত ফাইলগুলি সরিয়ে দেয়।

tryউপাদান উদাহরণস্বরূপ যদি আপনি কিছু ফাইল নিজে ইতিমধ্যেই সরানো হতে পারে, অথবা যদি উৎস ডিরেক্টরি থেকে সব ফাইল গন্তব্যে কপি করা হয়েছে জন্য, ত্রুটি প্রতিরোধ যোগ করা হয়। আপনার যদি সুডোর সুবিধাগুলির প্রয়োজন হয় তবে কেবল "সুডো" দিয়ে স্ক্রিপ্টটি চালান (নীচে দেখুন)।

এই পান্ডুলিপি

#!/usr/bin/env python

import os

source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to

for root, dirs, files in os.walk(source_dir):
    for name in files:
        try:
            os.remove(target_folder+"/"+name)
        except FileNotFoundError:
            pass

কিভাবে ব্যবহার করে

  • একটি ফাঁকা ফাইলে স্ক্রিপ্ট আটকান, এটি সংরক্ষণ করুন reverse.py,
  • উত্স এবং লক্ষ্য ফোল্ডারের জন্য সঠিক পাথগুলি sertোকান,
  • সুবিধার্থে এটি কার্যকর করতে সক্ষম করুন,
  • কমান্ড দ্বারা এটি চালান:

    [sudo] /path/to/reverse.py
    

সতর্কতা

প্রথমে একটি পরীক্ষা ডিরেক্টরিতে চেষ্টা করুন যদি আমি বুঝতে পারি যে আপনার কী অর্জন করা উচিত!


যদি সোর্সডাইরেক্টরিটি "ফ্ল্যাট" হয়

যদি উত্স ডিরেক্টরিতে কোনও উপ-ডিরেক্টরি না থাকে তবে স্ক্রিপ্টটি আরও সহজ হতে পারে:

#!/usr/bin/env python

import os

source_dir = "/path/to/source" # the folder you copied the files from
target_folder = "/path/to/destination" # the folder you copied the files to

for file in os.listdir(source_dir):
    try:
        os.remove(target_folder+"/"+file)
    except FileNotFoundError:
        pass

বিঃদ্রঃ

যদি অনুলিপি অ্যাকশন গন্তব্যস্থলে অনুরূপ নামের একটি ফাইলকে ওভাররোট (প্রতিস্থাপন) করা হয়, তবে ফাইলটি সরানো হবে, তবে মূল ফাইলটি (অবশ্যই) স্ক্রিপ্টের মাধ্যমে ফিরিয়ে আনা হবে না। অনুমান যে কোনও নাম সংঘর্ষ নেই।


এটি কাজ করে, আপনাকে ধন্যবাদ। আমি এটি চালাচ্ছি sudo python3 reverse.py। আমি আপনার উত্তর গ্রহণ।
нιηসнιη

পারফেক্ট! একটি সুন্দর প্রশ্নের জন্য আপনাকে ধন্যবাদ, যা এমন পরিস্থিতিতে বর্ণনা করে যা আমরা সম্ভবতঃ সবাইকে
রেখেছি

দ্রষ্টব্য: উত্সের কোনও ফাইল যদি গন্তব্যস্থ কোনও ফাইলের ওভাররোট করে কারণ এটির একই নাম ছিল, তবে আপনি কেবল এটি করতে পারবেন না এবং এই স্ক্রিপ্টটি কেবল এটি মুছবে। এখানে অনুমান করা হয় যে আপনি যখন প্রাথমিক করেছিলেন তখন কোনও নাম সংঘর্ষ হয় নি cp
থোমাসরুটটার

@ নিউনওভারলোড সঠিক, আমার উত্তরে এটি সম্পাদিত।
জ্যাকব Vlijm

এটি কাজ করে না cp -r। আমি পরিবর্তন os.removeসঙ্গে print, এবং এটি যে ফাইল বিদ্যমান নেই একটি গুচ্ছ outputting হচ্ছে। আমি ধরে নিচ্ছি যে এটি উপ-ডিরেক্টরিগুলি মিস করছে এবং কেবল শেষে ফাইলগুলি তালিকাবদ্ধ করছে listing
টাইপওয়ার

7

টি এল; ডিআর:

উভয় উপস্থিত থাকা সমস্ত ফাইল srcএবং এর destথেকে সরানো যেতে পারে dest:

find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;

ধাপে ধাপে, ব্যাখ্যার জন্য, নীচে দেখুন।

সমস্যার সরলকরণ:

কমান্ডটি আমরা কী করতে চাই তা বাস্তবে বুঝতে চাইলে আমরা এটিকে সহজ করে শুরু করি:

আমরা যে কমান্ডটি বাতিল করতে চাই তা হ'ল

sudo cp From_SOURCE/* To_DESTINATION/

কীভাবে পূর্বাবস্থায় ফেলা sudoযায় তা বোঝার জন্য, এটি প্রাসঙ্গিক নয়।

আমি ডিরেক্টরিগুলির srcজন্য From_SOURCEএবং এর destজন্য ব্যবহার করব To_DESTINATION

এখন, আমাদের আদেশটি হ'ল:

cp src/* dest/

যদি srcফাইলগুলি f1, f2এবং f3ডিরেক্টরিগুলি d1এবং থাকে d2এবং শেলটি কমান্ডটি প্রসারিত করে:

cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/

ছাড়া অপশন পছন্দ -r, -Rবা -a, কমান্ড cpডিরেক্টরি কপি নেই।
এর অর্থ, কমান্ড তাদের প্রত্যেককে একটি ত্রুটি দেখিয়ে ছেড়ে চলে যাবে:

$ cp src/f1 src/f2 src/f3 src/d1 src/d2 dest/
cp: omitting directory 'src/d1'
cp: omitting directory 'src/d2'

এর অর্থ, আমরা কেবলমাত্র সরল ফাইলগুলি, এবং কোনও ডিরেক্টরিতে অনুলিপি করেছি dest

কোন ফাইলগুলি অপসারণ করবেন তা স্থির করে:

সম্ভবত ফাইলগুলির মধ্যে destএকই নামের ফাইল ছিল src। এই ক্ষেত্রে, ফাইলগুলি ওভাররাইট করা হয়েছিল (1)। তাদের জন্য দেরি হয়ে গেছে, দুঃখিত। সর্বশেষতম ব্যাকআপ থেকে সেগুলি ফিরে পান।

সেখানে থাকা ফাইলগুলি সম্পর্কে, আমরা কেবল অনুলিপি করা ফাইলগুলি সরাতে চাই। এই ফাইলগুলি একই নাম এবং একই বিষয়বস্তু সহ উভয় ডিরেক্টরিতে বিদ্যমান।

সুতরাং আমরা এই ফাইলগুলি সন্ধান করি:

প্রথমত, আমরা এতে cdপ্রবেশ করি src, কারণ এটি নিম্নলিখিত findকমান্ডগুলিকে আরও সহজ করে তোলে এবং নিয়তের পরম পথে একটি পরিবর্তনশীল সেট করে:

$ cd src
$ destdir="$(readlink -f dest)"

তারপরে, আমরা এসসিআর-তে সমস্ত ফাইল তালিকাভুক্ত করি:

$ find . -maxdepth 1 -type f

এবং, পাওয়া প্রতিটি ফাইলের জন্য, cmpভাগ্যে একই বিষয়বস্তুযুক্ত কোনও ফাইল আছে কিনা তা পরীক্ষা করে দেখুন:

$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -print

ফাইলগুলি সরানো হচ্ছে, সাবধানতার সাথে:

এই ফাইলগুলি হ'ল আমরা মুছে ফেলতে চাই। তবে নিশ্চিত হয়ে ওঠার জন্য, আমরা প্রথমে তাদের একটি আলাদা ডিরেক্টরিতে স্থানান্তরিত করি - এবং কমান্ডগুলি চালানোর আগে একবার দেখে নিন:

$ toDelete=/tmp/toDelete ; mkdir -p "$toDelete"
$ find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec echo mv -n "$destdir/{}" "$toDelete"/ \;
mv -n /path/to/dest/./f1 /tmp/toDelete/`
mv -n /path/to/dest/./f2 /tmp/toDelete/`
mv -n /path/to/dest/./f3 /tmp/toDelete/`

ভাল লাগছে! এখন আমরা echoআসল mvকমান্ডগুলি চালিয়ে যেতে পারি :

find . -maxdepth 1 -type f -exec cmp -s '{}' "$destdir/{}" \; -exec mv -n "$destdir/{}" "$toDelete"/ \;

destযেগুলি থেকে সমস্ত ফাইল অনুলিপি করা হয়েছিল srcএবং এখনও বাস্তবে একইরকম srcএবং destএখন রয়েছে /tmp/toDelete/এবং সর্বশেষ নজর দেওয়ার পরে এটি সরানো যেতে পারে।


নোটস:
(1) পরীক্ষা করুন যে cpকোনও নাম cp -iবা এটির মতো কিনা , এটি প্রথমে জিজ্ঞাসা করে ফাইলগুলিকে ওভাররাইটিং আটকাতে পারে।


5

এটি পুরানো, তবে আমি খাঁটি বাশ উত্তর পোস্ট করতে চেয়েছিলাম:

আপনি যে ডিরেক্টরিটিতে ফাইল অনুলিপি করেছেন সেখানে প্রথমে পরিবর্তন করুন।

cd dest

তারপরে, lsউত্স ডিরেক্টরি এবং আউটপুটটি পাইপ করুনrm

ls source | xargs rm


2
পার্সিং lsকরা সাধারণত একটি খারাপ ধারণা। mywiki.wooledge.org/ পার্সিংএলগুলি আমি আপনার পোস্টকে হ্রাস করব না, তবে এটি লক্ষ্য রাখতে হবে।
সের্গেই কলডিয়াজনি

পছন্দ করুন কখনই কম নয়: rm `ls`folder ফোল্ডারের পূর্বে একটি খালি জন্য এবং যখন ফাইলগুলির ফাঁকা স্থান এবং নিউলাইনগুলি ছাড়াই নাম থাকে।
মাল্টিফিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.