메모

메모

파일을 제외한 파일을 삭제하는 방법을 묻는 게시물이 많이 있지만 제 질문은 더 구체적입니다. migrations현재 디렉터리의 하위 폴더에는 __init__.py파일 등을 포함하는 여러 개의 폴더가 있습니다 . 현재 폴더의 __init__.py이름이 지정된 모든 하위 폴더를 제외한 모든 파일을 삭제하는 방법은 무엇입니까 ?migrations

__init__.pyUPD: 빈 파일로 덮어쓰는 것도 가능한가요 ?

폴더 구조:

├── folder_1
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
├── folder_2
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc
├── folder_3
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-35.pyc
│   │       └── __init__.cpython-35.pyc

답변1

와 함께 find:

find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete

이는 find현재 디렉터리( .)에서 실행되며 다음을 수행합니다.

  • 일치하는 항목이 있으면 명령 migrations/__init__.py을 실행합니다 truncate. truncate -s 0 <file>파일을 크기 0(비어 있음)으로 줄입니다.
  • 해당 일치에 실패하면 일치하는 모든 항목 migrations/*이 삭제됩니다.
  • in bash 와 달리 in *경기 .-path/*

예:

$ tree                                                                                                                                   
.
├── folder_1
│   └── migrations
│       ├── 0001_initial.py
│       ├── __init__.py
│       └── __pycache__
│           ├── 0001_initial.cpython-35.pyc
│           └── __init__.cpython-35.pyc
├── folder_2
│   └── migrations
│       ├── 0001_initial.py
│       ├── __init__.py
│       └── __pycache__
│           ├── 0001_initial.cpython-35.pyc
│           └── __init__.cpython-35.pyc
└── folder_3
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    └── migrations
        ├── 0001_initial.py
        ├── __init__.py
        └── __pycache__
            ├── 0001_initial.cpython-35.pyc
            └── __init__.cpython-35.pyc

9 directories, 15 files
$ find . -path '*/migrations/__init__.py' -exec truncate -s 0 {} + -o -path '*/migrations/*' -delete                
$ tree                                                                                              
.
├── folder_1
│   └── migrations
│       └── __init__.py
├── folder_2
│   └── migrations
│       └── __init__.py
└── folder_3
    ├── admin.py
    ├── apps.py
    ├── __init__.py
    └── migrations
        └── __init__.py

6 directories, 6 files

$ wc -l */migrations/__init__.py
0 folder_1/migrations/__init__.py
0 folder_2/migrations/__init__.py
0 folder_3/migrations/__init__.py
0 total

답변2

.py 파일을 생성하고 경로(작업할 디렉터리)를 편집한 후 컴파일합니다(python3).

  • 코드: 'target_folder' 내부의 'target_file'을 제외하고 'path'에 있는 모든 파일을 삭제합니다. 즉, 그냥 비어 있습니다.
import os, sys
path='/home/vitor/Desktop/teste/'
target_folder='migrations'
target_file='__init__.py'

for directory, subdirs, files in os.walk(path):
    for file_name in files:
        folder_name=os.path.split(os.path.abspath(directory))[-1]
        if(folder_name==target_folder and file_name==target_file):
            open(directory+'/'+file_name, 'w').close()
        else:
            os.remove(directory+'/'+file_name)

답변3

다음은 더 간단한 명령입니다. 누군가가 이미 질문에 답했다는 것을 알고 있지만 이러한 명령은 더 간단하고 고유해야 합니다. 작동하는지 확인해보세요.

__init__.py삭제된 파일을 제외한 모든 하위 폴더와 파일을 제거하고 표시하려면 다음 명령을 시도하십시오.

rm -rfv ./*/migrations/!(__init__.py)

빈 파일을 만들려면 다음 명령을 추가하면 됩니다.

> ./*/migrations/__init__.py

위의 명령은 다음과 같이 빈 데이터를 파일에 쓰는 것과 같습니다.

/dev/null > ./*/migrations/__init__.py

메모

이 모든 명령은 현재 디렉터리에서 실행됩니다..

예방법

명령을 시도하기 전에 백업을 만드십시오. 이 세상에 100% 완벽한 사람은 없습니다.

관련 정보