অন্য ফোল্ডারে থাকা ফোল্ডার থেকে ফাইলগুলি সরানোর কোনও উপায় আছে কি?


21

আসুন আমি বলি যে আমি ফোল্ডার এ থেকে ফাইলগুলি অনুলিপি করে আটকিয়েছি, যার মধ্যে রয়েছে:

ফোল্ডার এ:

file1.cfg  
file2.txt  
file3.esp  
file4.bsa  

বি ফোল্ডারে বি, যা আপডেট করার পরে রয়েছে:

ফোল্ডার বি:

apples.mp3  
file1.cfg    *
file2.txt    *
file3.esp    *
file4.bsa    *
turtles.jpg

ফোল্ডার বি এ থাকা সমস্ত ফাইল (* * দিয়ে চিহ্নিত) থেকে মুছে ফেলার কোনও উপায় আছে কি? প্রত্যেকটিকে ম্যানুয়ালি নির্বাচন করা এবং এটি মোছার পাশাপাশি, বা অনুলিপি-পেস্টের ঠিক পরে সিটিআরটিএল-জিং করা

আমি উইন্ডোজ পদ্ধতি বা এমন কোনও সফ্টওয়্যার পছন্দ করতে চাই যা এটি করতে পারে

ধন্যবাদ!


4
আপনি কীভাবে জানবেন যে তারা একই ফাইলগুলি সামগ্রী-ভিত্তিক? আমি এমন দৃশ্যের কল্পনা করতে পারি না যেখানে আপনি অন্ধভাবে কোনও ফাইলের নামের উপর ভিত্তি করে কোনও ফাইলটিকে নকল হিসাবে বিবেচনা করতে চান।
rory.ap

@ ররিয়াপ আমার মনে হয় এই প্রশ্নটি উত্থাপিত হয়েছিল কারণ ওপি ফোল্ডার 1 থেকে ফোল্ডার 2 এ ফাইলগুলি অনুলিপি করেছে, সমস্ত প্রতিস্থাপন করেছে এবং এখন মনে করে, হুম, এটি একটি ভুল ছিল, কিন্তু বুঝতে পেরেছিল যে পরের দিন, সুতরাং পূর্বাবস্থা সম্ভব নয়। তবে আপনি ঠিক বলেছেন, বিষয়বস্তু যা আপনি জানতে পারবেন না।
LPChip

13
কেবল একটি বোবা প্রশ্ন ... কেন "কাটা" এবং "পেস্ট" ব্যবহার করবেন না?
দামাচক

@ ডামাচক যদি আপনি নেটওয়ার্ক ড্রাইভ বা অপসারণযোগ্য মিডিয়া নিয়ে কাজ করছেন তবে অনুলিপি করুন> যাচাই করুন-> সাফ আপ একটি যুক্তিসঙ্গত রুট। যদি ফাইলগুলি কোনও প্রক্রিয়া দ্বারা ব্যবহৃত হয়, তবে এটি অনুলিপি দ্বারা পরীক্ষা করা ভাল ধারণা হতে পারে (ইনপুট ফাইলটি ক্লোবার্বিংয়ের নিজস্ব কোডে বাগের ক্ষেত্রে পাইথন ডেটা বিশ্লেষণের জন্য ফাইলগুলির সাথে আমি এটি করি) এটি উদাহরণস্বরূপ It আগে যেমন প্রয়োজন তেমন প্রয়োজন হবে না, তবে পুরানো অভ্যাস এবং এগুলি সবই। বিকল্পভাবে ওপিতে কাটার পরিবর্তে ভুল ক্লিক করা যেতে পারে,
ক্রিস এইচ

উত্তর:


35

উইনমার্জ নামে একটি মুক্ত সফ্টওয়্যার রয়েছে । সদৃশ মিলে যাওয়ার জন্য আপনি এই সফ্টওয়্যারটি ব্যবহার করতে পারেন। প্রথমে File→ ব্যবহার করুন Openএবং উভয় ডিরেক্টরি বেছে নিন, যে ফাইলগুলির ফোল্ডারটি আপনি বামে রাখতে চান এবং যেগুলি আপনি ডানদিকে রাখেন না। তারপর, এখানে যান View, এবং অনির্বাচন করুন Show Different Items, Show Left Unique Itemsএবং Show Right Unique Items। এটি তালিকায় থাকা অভিন্ন ফাইলগুলিকে ছেড়ে দেবে। এর পর, চয়ন EditSelect Allকোন ফাইলের উপর রাইট ক্লিক করুন, এবং এ ক্লিক করুন DeleteRight। এটি ডান হাতের ফোল্ডার থেকে সদৃশগুলি মুছে ফেলবে।

উইনমার্গের ডেমো


এই পদ্ধতির সুবিধাটি হ'ল এটি গুরুত্বপূর্ণ যে যদি ফাইলগুলি বিষয়বস্তু অনুসারে অনুরূপ না হয় তবে তা সনাক্ত করতে পারে। উইনমার্জ সমস্ত বিষয়গুলির সাথে একটির সাথে তুলনা করতে পারে।

25

কমান্ড ব্যবহার করে কমান্ডলাইনের মাধ্যমে এটি করা যেতে পারে forfiles

ধরে নেওয়া যাক আপনার কাছে ফোল্ডার এ রয়েছে c:\temp\Folder Aএবং ফোল্ডার বি রয়েছেc:\temp\Folder B

আদেশটি তখন হবে:

c:\>forfiles /p "c:\temp\Folder A" /c "cmd /c del c:\temp\Folder B\@file"

এটি সম্পন্ন হওয়ার পরে, ফোল্ডার বিতে ফোল্ডার এ-তে উপস্থিত সমস্ত ফাইল মুছে ফেলা হবে মনে রাখবেন, ফোল্ডার বিতে যদি একই নামের ফাইল থাকে তবে একই বিষয়বস্তু না থাকে তবে সেগুলি মুছে ফেলা হবে।

সাবফোল্ডারগুলিতে ফোল্ডারগুলির সাথে এটির কাজ করার জন্য এটি বাড়ানোও সম্ভব তবে এটি অপ্রয়োজনীয় জটিল হওয়ার ভয়ে আমি এটিকে পোস্ট করার বিরুদ্ধে সিদ্ধান্ত নিয়েছি। এটির জন্য / গুলি এবং @ রিলপাথ বিকল্পগুলি (এবং আরও পরীক্ষার এক্সডি) প্রয়োজন হবে


11

আপনি এই পাওয়ারশেল স্ক্রিপ্টটি ব্যবহার করতে পারেন:

$folderA = 'C:\Users\Ben\test\a\' # Folder to remove cross-folder duplicates from
$folderB = 'C:\Users\Ben\test\b\' # Folder to keep the last remaining copies in
Get-ChildItem $folderB | ForEach-Object {
    $pathInA = $folderA + $_.Name
    If (Test-Path $pathInA) {Remove-Item $pathInA}
}

আশা করি এটি মোটামুটি স্ব-ব্যাখ্যামূলক। এটি ফোল্ডার বি এর প্রতিটি আইটেম দেখায়, ফোল্ডার এ তে একই নামের কোনও আইটেম আছে কিনা তা পরীক্ষা করে এবং যদি তা হয় তবে এটি ফোল্ডার এ আইটেমটি সরিয়ে দেয়। নোট করুন যে \ফোল্ডার পাথগুলিতে ফাইনালটি গুরুত্বপূর্ণ।

এক-লাইন সংস্করণ:

gci 'C:\Users\Ben\test\b\' | % {del ('C:\Users\Ben\test\a\' + $_.Name) -EA 'SilentlyContinue'}

আপনি যদি কনসোলে লাল ত্রুটির প্রলয় পান কিনা তা যদি আপনার চিন্তা না করে তবে আপনি এটি মুছে ফেলতে পারেন -EA 'SilentlyContinue'

এটি একটি .ps1ফাইল হিসাবে সংরক্ষণ করুন, যেমন dedupe.ps1। পাওয়ারশেল স্ক্রিপ্টগুলি চালানোর আগে আপনাকে তাদের সম্পাদন সক্ষম করতে হবে:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser

তারপরে আপনি .\dedupe.ps1এতে থাকা ফোল্ডারে থাকাকালীন আপনি এটির সাথে আবেদন করতে সক্ষম হবেন ।


4

rsync

rsyncডিরেক্টরি সিঙ্ক্রোনাইজ করার জন্য ব্যবহৃত একটি প্রোগ্রাম। অনেক (সত্যিই অনেক) অপশন আছে থেকে স্ব ব্যাখ্যা আছে --ignore-non-existing, --remove-source-filesএবং --recursive

আপনি করতে পারেন

rsync -avr --ignore-non-existing --recursive --remove-source-files   B/ A -v

যদি আমরা ধরে নিই যে আপনার কাছে এ (4) এবং বি (4 + 2) ডিরেক্টরিতে ফাইল রয়েছে।

A       B
├── a   ├── a
├── b   ├── b
├── c   ├── c
└── d   ├── d
        ├── e
        └── f     # Before


A       B
├── a   ├── e
├── b   └── f
├── c   
└── d             # After

4

এলপিসিপির উত্তরটি আরও ভাল।

তবে আমি পাইথন শিখতে শুরু করার কারণে, আমি ভেবেছিলাম, "হেক, এই প্রশ্নের উত্তর হিসাবে পাইথন লিপিটি কেন লিখবেন না?"

পাইথন এবং সেন্ড 2 ট্র্যাশ ইনস্টল করুন

কমান্ড লাইন থেকে স্ক্রিপ্ট চালানোর আগে আপনাকে পাইথন ইনস্টল করতে হবে।

তারপরে সেন্ড 2 ট্র্যাশ ইনস্টল করুন যাতে মোছা ফাইলগুলি অপ্রত্যাশিতভাবে না যায় তবে ওএসের ট্র্যাশে শেষ হয়:

pip install Send2Trash

স্ক্রিপ্ট তৈরি করুন

উদাহরণস্বরূপ নাম সহ একটি নতুন ফাইল তৈরি করুন DeleteDuplicateInFolderA.py

নিম্নলিখিত স্ক্রিপ্টটি ফাইলটিতে অনুলিপি করুন।

#!/usr/bin/python

import sys
import os
from send2trash import send2trash


class DeleteDuplicateInFolderA(object):
    """Given two paths A and B, the application determines which files are in
       path A which are also in path B and then deletes the duplicates from
       path A.

       If the "dry run" flag is set to 'true', files are deleted. Otherwise
       they are only displayed but not deleted.
    """

    def __init__(self, path_A, path_B, is_dry_run=True):
        self._path_A = path_A
        self._path_B = path_B
        self._is_dry_run = is_dry_run

    def get_filenames_in_folder(self, folder_path):
        only_files = []
        for (dirpath, dirnames, filenames) in os.walk(folder_path):
            only_files.extend(filenames)
        return only_files

    def print_files(sel, heading, files):
        print(heading)
        if len(files) == 0:
            print("   none")
        else:
            for file in files:
                print("   {}".format(file))

    def delete_duplicates_in_folder_A(self):
        only_files_A = self.get_filenames_in_folder(self._path_A)
        only_files_B = self.get_filenames_in_folder(self._path_B)

        files_of_A_that_are_in_B = [file for file in only_files_A if file in only_files_B]

        self.print_files("Files in {}".format(self._path_A), only_files_A)
        self.print_files("Files in {}".format(self._path_B), only_files_B)

        if self._is_dry_run:
            self.print_files("These files would be deleted: ", [os.path.join(self._path_A, file) for file in files_of_A_that_are_in_B])
        else:
            print("Deleting files:")
            for filepath in [os.path.join(self._path_A, file) for file in files_of_A_that_are_in_B]:
                print("   {}".format(filepath))
                # os.remove(filepath)  # Use this line instead of the next if Send2Trash is not installed
                send2trash(filepath)

if __name__ == "__main__":
    if len(sys.argv) == 4:
        is_dry_run_argument = sys.argv[3]
        if not is_dry_run_argument == "--dryrun":
            println("The 3rd argument must be '--dryrun' or nothing.")
        else:
            app = DeleteDuplicateInFolderA(sys.argv[1], sys.argv[2], is_dry_run=True)
    else:
        app = DeleteDuplicateInFolderA(sys.argv[1], sys.argv[2], is_dry_run=False)
    app.delete_duplicates_in_folder_A()

ব্যবহার

ড্রাই ড্রাই মোড, যা আপনাকে দেখায় যে কোন ফাইলগুলি আসলে কোনও ফাইল মোছা না করে মুছে ফেলা হবে:

c:\temp> python .\DeleteDuplicateInFolderA.py c:\temp\test\A c:\temp\test\B --dryrun

ফাইল মোছার মোড, যা প্রকৃতপক্ষে ফাইলগুলি মুছে দেয় তাই সতর্কতা অবলম্বন করুন:

c:\temp> python .\DeleteDuplicateInFolderA.py c:\temp\test\A c:\temp\test\B

শুকনো রান মোডের আউটপুট

Files in C:\temp\A
  1.txt
  2.txt
Files in C:\temp\B
  2.txt
  3.txt
These files would be deleted:
  C:\temp\A\2.txt

ফাইল মোছার মোডের আউটপুট

Files in C:\temp\A
  1.txt
  2.txt
Files in C:\temp\B
  2.txt
  3.txt
Deleting files:
  C:\temp\A\2.txt

ইউনিট পরীক্ষা

আপনি যদি উপরের অ্যাপ্লিকেশনটি পরীক্ষা করতে চান তবে একটি ফাইল তৈরি করুন DeleteDuplicateInFolderATest.pyএবং এই ইউনিটসেটগুলি এতে পেস্ট করুন:

import unittest
import os
import shutil
from DeleteDuplicateInFolderA import DeleteDuplicateInFolderA


class DeleteDuplicateInFolderATest(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(DeleteDuplicateInFolderATest, self).__init__(*args, **kwargs)
        self._base_directory = r"c:\temp\test"
        self._path_A = self._base_directory + r"\A"
        self._path_B = self._base_directory + r"\B"

    def create_folder_and_create_some_files(self, path, filename_list):
        if os.path.exists(path):
            shutil.rmtree(path)
        os.makedirs(path)
        for filename in filename_list:
            open(os.path.join(path, filename), "w+").close()

    def setUp(self):
        # Create folders and files for testing
        self.create_folder_and_create_some_files(self._path_A, ["1.txt", "2.txt"])
        self.create_folder_and_create_some_files(self._path_B, ["2.txt", "3.txt"])

    def tearDown(self):
        for path in [self._path_A, self._path_B, self._base_directory]:
            if os.path.exists(path):
                shutil.rmtree(path)

    def test_duplicate_file_gets_deleted(self):
        # Arrange
        app = DeleteDuplicateInFolderA(self._path_A, self._path_B, is_dry_run=False)

        # Act
        app.delete_duplicates_in_folder_A()

        # Assert
        self.assertFalse(os.path.isfile(self._path_A + r"\2.txt"), "File 2.txt has not been deleted.")

    def test_duplicate_file_gets_not_deleted_in_mode_dryrun(self):
        # Arrange
        app = DeleteDuplicateInFolderA(self._path_A, self._path_B, is_dry_run=True)

        # Act
        app.delete_duplicates_in_folder_A()

        # Assert
        self.assertTrue(os.path.isfile(self._path_A + r"\2.txt"), "File 2.txt should not have been deleted in mode '--dryrun'")

def main():
    unittest.main()

if __name__ == '__main__':
    main()

আপনি আমাকে বলতে পারবেন কেন এই লিপিটি "নরকের মতো কুশ্রী"? আমি কেবল এটির মাধ্যমে পড়েছি এবং আপনি যা করছেন তা ক্রিস্টাল স্পষ্ট। আমি প্রায় কোডআরভিউ.এসইতে এটি সম্পর্কে কী পছন্দসই নয় তা শিখতে প্রলুব্ধ করছি।
ব্যবহারকারী 1717828

ফাইলগুলির বিষয়বস্তু একই রকম কিনা তা পরীক্ষা করতে একটি এমডি 5সাম যুক্ত করা একটি দুর্দান্ত বিকল্প হবে। অপসারণের পরিবর্তে ওএস ট্র্যাশ প্রক্রিয়াটি ব্যবহার করা using
লোলস্কে

@ ব্যবহারকারী 1717828: আমি কোডটি পুনর্গঠন করেছি, সেই মন্তব্য মুছে ফেলেছি এবং কোডআরভিউ.এসইতে কোড পোস্ট করার জন্য আপনার পরামর্শ নিয়েছি ।
লার্নকুরভে

@ লেলেসেক: সেন্ড 2 ট্র্যাশ অংশ: সম্পন্ন হয়েছে। ধারনাটির জন্য তোমাকে ধন্যবাদ!
লার্নকুরভে

1
@ বার্লপ, আমি কোনও মন্তব্য নয়, মূল পোস্টে জবাব দিচ্ছিলাম।
ব্যবহারকারী 1717828

1

ব্যাশ ব্যবহার করা

for f in $(ls /path/to/folderB/); do 
    rm -rf /path/to/folderA/$f
done

নিশ্চিত যে আপনি ফাইলটি আছে কিনা তা পরীক্ষা করে বা ফাইলের নামটি নিরাপদ কিনা তা পরীক্ষা করে আরও সুরক্ষিত হতে পারেন। তবে ধরে নিচ্ছেন আপনি কেবল এটি সম্পন্ন করতে চান, এবং কোনও হাস্যকর নামে ফাইল যুক্ত করবেন না folderB- এটি সম্পন্ন করার জন্য এটি একটি দ্রুত এবং নোংরা উপায়। (এবং আপনি ব্যাশ এমুলেটর যে দিয়ে আসে ব্যবহার করতে পারেন Git , যদি আপনি Win10 + + ব্যাশ চলমান হয় না)


আপনি যদি ডিরেক্টরিগুলি খুঁজে পান তবে আপনাকে একটি চেক যোগ করতে হবে ...
হাস্টুর

1

টোটাল কমান্ডারের মতো কোনও এনসি-স্টাইল প্রোগ্রামের একটি ডিরেক্টরি পার্থক্য কমান্ড রয়েছে যা অন্য ট্যাব থেকে পৃথক দুটি ট্যাবে ফাইল নির্বাচন করে। tabবৃহত্তর ডিরেক্টরিতে (বি) এই কমান্ডটি কল করুন , নির্বাচনটি নির্বাচন করুন *এবং মুছুন। এর ফলে এমন ফাইলগুলি মুছে না ফেলার সুবিধা রয়েছে যা পরিবর্তিত হতে পারে (কোনওভাবে) এবং তারা নামটিতে সম্মত হলেও একই নয়। আপনি মুছে ফেলার পরে এটি সনাক্ত করতে একই ডিরেক্টরি ডিফ কমান্ড ব্যবহার করতে পারেন।

আমার ধারণা আমি নব্বইয়ের দশকে আটকে গিয়েছি ... তবে আমি এখনও এর থেকে আরও মার্জিত কিছু দেখিনি :-) এখন পর্যন্ত এটিই কেবলমাত্র একমাত্র উত্তর যা প্রায় 5 টি কীস্ট্রোক এবং কোনও স্ক্রিপ্টিং / কমান্ড লাইন প্রয়োজন নেই।


1

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

ফোল্ডার বি এ থাকা ফোল্ডার এ থেকে সমস্ত ফাইল মুছার উপায় কি আছে? প্রত্যেকটিকে ম্যানুয়ালি নির্বাচন করা এবং এটি মোছার পাশাপাশি, বা অনুলিপি-পেস্টের ঠিক পরে সিটিআরটিএল-জিং করা

উইন্ডোজ পদ্ধতি

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

  • আপনার প্রয়োজনের জন্য সেই অনুযায়ী SourceDirএবং DestDirভেরিয়েবলগুলি সেট করতে ভুলবেন না ।

  • অতিরিক্ত হিসাবে, নীচের স্ক্রিপ্টের অংশ হিসাবে ("%SourceDir%\*.*") DOআপনি কেবল *.*ফাইলের নাম ( File A.txt) বা ফাইল এক্সটেনশন ( *.wav) হিসাবে প্রয়োজন হিসাবে আরও স্পষ্ট হতে মান পরিবর্তন করতে পারেন ।


@ECHO ON
SET SourceDir=C:\Users\User\Desktop\Source
SET DestDir=C:\Users\User\Desktop\Dest

FOR %%A IN ("%SourceDir%\*.*") DO XCOPY /F /Y "%%~A" "%DestDir%\" && DEL /Q /F "%%~A"
GOTO EOF

আরও সংস্থান

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