- 1. 参考にしたサイト
- 2. ファイルの更新日付を変更する
- 3. 解説
- 4. 修正
1. 参考にしたサイト
下記を参考にさせていただきました。
参考にさせていただいたサイトは、リンク切れになりました。
実は、ここんとこ(2017年11月~12月)python をさわっていたのはこれが目的だったのです。
perl なら1日もあればできると思いますが、そこは勉強がてらということで。
2. ファイルの更新日付を変更する
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import os
import time
import sys
dirname = sys.argv[1] # 第一引数でディレクトリを指定
setdate = sys.argv[2] # 第二引数で日付を指定
inp = input(dirname+ ' 配下のファイルの更新日付を\n '+ setdate[0:4] + '年'+ setdate[4:6] + '年'+ setdate[6:8] + '日に設定しますがよろしいですか?')
if (inp != 'Y' and inp != 'y'): sys.exit()
atime = mtime = time.mktime(time.strptime(setdate, '%Y%m%d'))
def find_all_files(directory):
for root, dirs, files in os.walk(directory):
yield root
for file in files:
yield os.path.join(root, file)
for file in find_all_files(dirname):
root, ext = os.path.splitext(file)
if (ext == '.py'): os.utime(file, (atime, mtime))
3. 解説
inp = input(dirname+ '・・・')
は、input で標準入力からの取り込みを行い、inp に入力しています。
input の引数は、プロンプトとして出力されます。
root, ext = os.path.splitext(file)
は、ディレクトリ名とファイル名の文字列を、ディレクトリ名・ファイル名と拡張子に分割しています。
なんで、拡張子だけ分割されるかは、今のところ(2017年12月4日)謎。
if (ext == '.py'): os.utime(file, (atime, mtime))
は、拡張子は .py であったら、ファイルの参照日付と更新日付を、更新しています。
ちょっとはまったのが、拡張子の箇所が . がついていないと思い込んでしまってまして、全然更新されなくて、次項のデバッガを使う羽目になりました。
とここまでやって、拡張子も引数にしなければなぁと思いなおして
4. 修正
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
import os
import time
import sys
if (len(sys.argv) != 4):
print('引数を ディレクトリ 拡張子 日付 の形式で入力してください')
sys.exit()
dirname = sys.argv[1] # 第一引数でディレクトリを指定
extname = sys.argv[2] # 第二引数で日付を指定
setdate = sys.argv[3] # 第三引数で日付を指定
inp = input(dirname+ ' 配下の' + \
' .' + extname +' ファイルの更新日付を\n ' + \
setdate[0:4] + '年' + \
setdate[4:6] + '月' + \
setdate[6:8] + '日に設定しますがよろしいですか?')
if (inp != 'Y' and inp != 'y'): sys.exit()
atime = mtime = time.mktime(time.strptime(setdate, '%Y%m%d'))
def find_all_files(directory):
for root, dirs, files in os.walk(directory):
yield root
for file in files:
yield os.path.join(root, file)
for file in find_all_files(dirname):
root, ext = os.path.splitext(file)
if (ext == '.' + extname): os.utime(file, (atime, mtime))
if (len(sys.argv) != 4):
print('引数を ディレクトリ 拡張子 日付 の形式で入力してください')
sys.exit()
引数の個数チェックを増やしました。
if 文に複数の実行行が存在するときは、: コロンの後ろで改行し、タブでインデントして複数行書くことが分かりました。
inp = input(dirname+ ' 配下の' + \
' .' + extname +' ファイルの更新日付を\n ' + \
setdate[0:4] + '年' + \
setdate[4:6] + '月' + \
setdate[6:8] + '日に設定しますがよろしいですか?')
行が長いときは、\(バックスラッシュ)で次の行にわたって書けることが分かりました。
う~む。円記号を出力するエスケープ文字はあるものの、バックスラッシュを出力するエスケープ文字は調べられなかった。こういうのを片手落ちというのだ。
|