
特定のファイルを除くファイルを削除する方法を尋ねる投稿はたくさんありますが、私の質問はより具体的です。migrations
現在のディレクトリのサブフォルダーに、ファイルなどを含む、名前が付けられたフォルダーがいくつか存在します。現在のフォルダーから名前が付けられたすべてのサブフォルダー__init__.py
を除くすべてのファイルを削除するにはどうすればよいですか?__init__.py
migrations
__init__.py
UPD:空のファイルで上書きすることは可能ですか?
フォルダ構造:
├── 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
*
は、 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% 完璧な人間は存在しません。