다른 폴더에있는 폴더에서 파일을 제거하는 방법이 있습니까?


21

폴더 A에서 파일을 복사하여 붙여 넣습니다. 여기에는 다음이 포함됩니다.

폴더 A :

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

업데이트 후 폴더 B에 다음이 있습니다.

폴더 B :

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

폴더 B에있는 폴더 A에서 모든 파일을 삭제하는 방법이 있습니까 (*로 표시됨)? 각 항목을 수동으로 선택하여 삭제하거나 복사하여 붙여 넣은 직후에 Ctrl-Z

Windows 방법이나이를 수행 할 수있는 소프트웨어를 선호합니다.

감사!


4
파일이 내용 적으로 동일한 파일인지 어떻게 알 수 있습니까? 파일 이름만으로 파일을 복제본으로 맹목적으로 고려하려는 시나리오를 상상할 수 없습니다.
rory.ap

@roryap OP가 폴더 1에서 폴더 2로 파일을 복사하고 모든 파일을 바꾸고 이제는 실수라고 생각하기 때문에이 질문이 발생했다고 생각합니다. 흠, 이것은 실수이지만 다음날 취소 할 수 없다는 것을 알고 있습니다. 그러나 당신이 옳습니다, 당신이 알 수없는 contentwize.
LPChip

13
바보 같은 질문 ... 왜 "잘라 내기"와 "붙여 넣기"를 사용하지 않습니까?
DaMachk

@DaMachk 네트워크 드라이브 나 이동식 미디어로 작업하는 경우 복사-> 확인-> 정리가 적절한 경로입니다. 일부 프로세스에서 파일을 사용하는 경우 복사본에서 파일을 테스트하는 것이 좋습니다 (예를 들어 입력 파일을 방해하는 자체 코드의 버그가있는 경우 파이썬 데이터 분석을 위해 파일로 수행합니다). 예전처럼 필요하지는 않지만 오래된 습관과 그 밖의 모든 것 OP가 잘라 내기 대신 복사를 잘못 클릭했을 수 있음
Chris H

답변:


35

WinMerge 라는 무료 소프트웨어가 있습니다 . 이 소프트웨어를 사용하여 중복을 일치시킬 수 있습니다. 먼저 File→를 사용 Open하고 왼쪽에 보관하려는 파일이있는 폴더와 오른쪽에없는 디렉토리가있는 두 디렉토리를 모두 선택하십시오. 그런 다음 이동 View및 선택 해제 Show Different Items, Show Left Unique ItemsShow Right Unique Items. 이렇게하면 목록에 동일한 파일 만 남게됩니다. 그런 다음 Edit→을 선택 Select All하고 파일을 마우스 오른쪽 버튼으로 클릭 한 다음 Delete→을 클릭하십시오 Right. 오른쪽 폴더에서 복제본이 삭제됩니다.

WinMerge 데모


이 방법의 장점은 파일이 내용과 유사하지 않은지 여부를 감지 할 수 있다는 것입니다. WinMerge는 중요한 모든 요소를 ​​하나와 비교할 수 있습니다.

25

명령을 사용하여 명령 줄을 통해 수행 할 수 있습니다. forfiles

에 폴더 A가 c:\temp\Folder A있고 폴더 B 가 있다고 가정합니다 .c:\temp\Folder B

명령은 다음과 같습니다.

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

이 작업이 완료되면 폴더 B에 폴더 A에있는 모든 파일이 제거됩니다. 폴더 B에 이름은 같지만 내용이 같은 파일이 있으면 여전히 삭제됩니다.

하위 폴더의 폴더로도 작업하도록 확장 할 수 있지만, 이것이 복잡해지기를 두려워하지 않기 때문에 게시하지 않기로 결정했습니다. / s 및 @relpath 옵션이 필요합니다 (추가 xD 테스트).


11

이 PowerShell 스크립트를 사용할 수 있습니다.

$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}
}

잘 설명되어 있기를 바랍니다. 폴더 B의 모든 항목을보고 폴더 A에 이름이 같은 항목이 있는지 확인하고,있는 경우 폴더 A 항목을 제거합니다. \폴더 경로 의 최종 항목 이 중요합니다.

한 줄 버전 :

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

콘솔에 빨간색 오류가 발생했는지 걱정하지 않으면을 제거 할 수 있습니다 -EA 'SilentlyContinue'.

.ps1파일 로 저장하십시오 ( 예 :) dedupe.ps1. PowerShell 스크립트를 실행하려면 먼저 해당 스크립트를 실행해야합니다.

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

디렉토리 A (4)와 B (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

LPChip의 답변 이 더 좋습니다.

그러나 파이썬을 배우기 시작했기 때문에 "이 질문에 대한 답으로 파이썬 스크립트를 작성하지 않겠습니까?"

Python 및 Send2Trash 설치

명령 행에서 스크립트를 실행하려면 먼저 Python을 설치해야합니다.

그런 다음 Send2Trash를 설치 하여 삭제 된 파일을 복구 할 수 없게하지 말고 OS의 휴지통에 넣으십시오 .

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만들고이 unittest를 붙여 넣습니다.

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()

왜이 대본이 "지저분 해"인지 말해 줄 수 있습니까? 방금 읽었으며 당신이하고있는 일은 맑습니다. CodeReview.SE에 붙여 넣기를 원하지 않는 것에 대해 배우려고합니다.
user1717828 2016 년

파일 내용이 같은지 확인하기 위해 md5sum을 추가하는 것이 좋은 옵션입니다. 또한 제거하는 대신 OS 휴지통 메커니즘을 사용합니다 .
lolesque

@ user1717828 : 코드를 재구성하고 해당 주석을 삭제하고 CodeReview.SE에 코드게시 할 것을 제안했습니다 .
Lernkurve 2016 년

@lolesque : Send2Trash 부분 : 완료 아이디어 주셔서 감사합니다!
Lernkurve 2016 년

1
@ barlop, 나는 의견이 아닌 원래 게시물에 회신하고있었습니다.
user1717828

1

bash 사용

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

파일이 있는지 확인하거나 파일 이름이 안전한지 확인하면 더 안전 할 수 있습니다. 그러나 당신이 이것을 끝내기를 원하고 어리석게 명명 된 파일을 가지고 있지 않다고 가정하면, folderB이것은 그것을 끝내는 빠르고 더러운 방법입니다. (그리고 Win10 + bash를 실행하지 않으면 git 과 함께 제공되는 bash 에뮬레이터를 사용할 수 있습니다 )


디렉토리를 찾으면 수표를 추가해야 할 수도 있습니다.
Hastur

1

Total Commander와 같은 NC 스타일 프로그램에는 두 탭에서 다른 탭과 다른 파일을 선택하는 디렉토리 차이 명령이 있습니다. 이 명령 tab을 더 큰 디렉토리 (B)로 호출 하여 선택을 *삭제하고 삭제하십시오. 이것은 (어떻게 든) 변경되었을 수도 있고 이름에 동의하더라도 동일하지 않은 파일을 삭제하지 않는 이점이 있습니다. 동일한 디렉토리 diff 명령을 사용하여 삭제 후 이들을 찾을 수 있습니다.

나는 90 년대에 갇혀있는 것 같아요 ...하지만 이후로 더 우아한 것을 보지 못했습니다 :-) 지금까지 이것은 5 번의 키 입력과 스크립팅 / 명령 줄이 거의 필요하지 않은 유일한 대답입니다.


1

폴더 A에서 폴더 B로 파일을 복사하여 붙여 넣었다고 가정 해 봅시다.

폴더 B에있는 폴더 A에서 모든 파일을 삭제하는 방법이 있습니까? 각 항목을 수동으로 선택하여 삭제하거나 복사하여 붙여 넣은 직후에 Ctrl-Z

윈도우 방법

항상 한 위치에서 다른 위치로 파일을 복사 한 다음 성공적으로 복사 된 파일도 원래 소스 위치에서 삭제되었는지 확인해야하는 경우 다음은 단 하나의 작업으로 전체 작업을 자동화하는 데 사용할 수있는 배치 스크립트 솔루션입니다. 각 실행을 간단히 클릭하십시오.

  • 필요에 따라 SourceDirDestDir변수 를 설정하십시오 .

  • 또한 아래 스크립트의 일부에서 필요에 따라 파일 이름 ( ) 또는 파일 확장자 ( )에 대해보다 명시 적으로 값을 ("%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.