Python 再帰的にディレクトリを探索する。そして、指定ファイルを指定ディレクトリへコピー or カレントディレクトリにある指定ファイルを消去するスクリプト

'22/06/18更新:コピーする場合、もし、実行前にそのディレクトリがすでに存在すれば、自動的に一旦そのディレクトリを丸ごと削除してから作成します。

▼仕様1. 再帰的にサブディレクトリ以下を探索し、指定したファイル名にマッチしたファイルをカレントディレクトリへコピーする

$ python del_or_copy.py copy csv

この場合、下図のように、カレントディレクトリ以下のサブディレクトリ内も含めて、ファイル名にcsvとあるファイルをカレントディレクトリへコピーする。拡張子が.txtであってもファイル名にcsvがあるファイルも対象になる。

f:id:HK29:20180430214138p:plain

$ python del_or_copy.py copy .csv

この場合、csvの前に「.」があるため、下図のように拡張子が.csvのみのファイルが抽出される。

f:id:HK29:20180430222725p:plain

 

▼仕様2. カレントディレクトリ内に指定ファイル名にマッチするファイルを消去する

$ python del_or_copy.py del csv

この場合、下図のように、カレントディレクトリにあるファイル名にcsvとあるファイルを消去する。コピー動作と違って、カレントディレクトリ内のみのファイルを対象としています。

f:id:HK29:20180430214324p:plain

 

▼本プログラム

 reモジュールを用いて文字列検索する場合、「.」のようなメタ文字を識別するためにescapeを使用することが特徴です。searchと併用して、「re.search(re.escape([検索文字列]), [対象文字列])」のように記述します。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys
import glob
import re, shutil

def del_files(my_target):
    for f in glob.glob('*'+ my_target + '*'):
        print('delete ', f)
        os.remove(f)

def copy_files():
    if os.path.isdir(save_dir):
        shutil.rmtree(save_dir)
    os.mkdir(save_dir)

    file_list = []
    filepath_list = []
    for dirpath, dirnames, filenames in os.walk(os.getcwd()):
        for file in filenames:
            m = re.search(re.escape(my_target), file) # re module, escape for meta
            #if m and ('3' not in dirpath):
            if m :
                print(dirpath)
                file_list.append(file)
                filepath_list.append(os.path.join(dirpath, file))
    
    for i in range(len(file_list)):
        save_file_path = os.path.join(save_dir, file_list[i])
        shutil.copy2(filepath_list[i], save_file_path)
        print(save_file_path)

def main():
    if my_action == 'del':
        print('call del_file')
        del_files(my_target)
    elif my_action == 'copy':
        print('call copy_file')
        copy_files()
    else:
        print('example input1: python del_or_copy.py del .jpg')
        print('example input2: python del_or_copy.py del derive_')
        print('example input3: python del_or_copy.py copy .csv')

if __name__ == '__main__':
    my_action = sys.argv[1]
    my_target = sys.argv[2]
    save_dir = './dirCsv'

    main()
    print('finished')
    

 以上

<広告>

<広告>