注記

注記

特定のファイルを除くファイルを削除する方法を尋ねる投稿はたくさんありますが、私の質問はより具体的です。migrations現在のディレクトリのサブフォルダーに、ファイルなどを含む、名前が付けられたフォルダーがいくつか存在します。現在のフォルダーから名前が付けられたすべてのサブフォルダー__init__.pyを除くすべてのファイルを削除するにはどうすればよいですか?__init__.pymigrations

__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、コマンドを実行しますtruncatetruncate -s 0 <file>ファイルのサイズを 0 (空) に縮小します。
  • 一致しない場合は、一致するものはすべてmigrations/*削除されます。
  • in*は、 in bashとは異なり-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% 完璧な人間は存在しません。

関連情報