笔记

笔记

很多帖子都问如何删除除单个文件以外的文件,但我的问题更具体。migrations当前目录的子文件夹中有几个文件夹,其中包含__init__.py文件和其他文件。如何删除除当前文件__init__.py夹下所有子文件夹中的所有文件migrations

UPD:是否可以__init__.py用空文件覆盖?

文件夹结构:

├── 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*-path匹配与 bash 中的/不同*

例子:

$ 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)。

  • 代码:删除“路径”上除“目标文件夹”内的“目标文件”之外的所有文件,这些文件只是清除(空)。
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% 完美的。

相关内容