(この記事は、眠たい私がハイになりつつ書いたため、テンションがおかしいですがお許しください)
このディレクトリの中のファイル、権限とかを全部書き換えたいなあ…
でも再帰処理とかめんどいな〜
とか思っているそこの君! os.walkを知っているかい!
os.walkとは
ディレクトリツリーをたどって、すべてのフォルダ、ファイルをなぞることを、for文だけで実装できるようにしてくれる素晴らしいメソッド
os.walkの引数、戻り値
引数
top
最初のディレクトリ、一番最初になぞることとなる
ここから下のディレクトリ、ファイルをなぞることになる
戻り値
dirpath
、dirnames
、filenames
それぞれ「現在のディレクトリ(topからのパス)」「サブディレクトリ(名前だけ)」「直下ファイル(名前だけ)」となっている
os.walkの使い方
まず、このようなディレクトリ構造があるとき
$tree ./test
./test
├── test1
│ ├── test4
│ │ └── text5.txt
│ └── text1.txt
├── test2
│ ├── text2.txt
│ └── text3.txt
└── test3
└── text4.txt
Cとかなら再帰処理などを挟んで、とやかくやらないと全部のファイルを触らなければいけないところを…
Test.py
import os
if __name__ == "__main__":
for root, dirs, files in os.walk("./test"):
print("現在ディレクトリ->",root)
print("サブディレクトリ->",dirs)
print("直下ファイル->", files)
print("-----")
実行結果
現在ディレクトリ-> ./test
サブディレクトリ-> ['test2', 'test1', 'test3']
直下ファイル-> []
-----
現在ディレクトリ-> ./test/test2
サブディレクトリ-> []
直下ファイル-> ['text3.txt', 'text2.txt']
-----
現在ディレクトリ-> ./test/test1
サブディレクトリ-> ['test4']
直下ファイル-> ['text1.txt']
-----
現在ディレクトリ-> ./test/test1/test4
サブディレクトリ-> []
直下ファイル-> ['text5.txt']
-----
現在ディレクトリ-> ./test/test3
サブディレクトリ-> []
直下ファイル-> ['text4.txt']
-----
なんとfor文だけですべて完結させてくれる!すっげえ!
なんて革新的!
使用例
- Linuxのファイル,ディレクトリ所有者変更スクリプト
import os
import pwd
import grp
def change_owner_recursively(path, user, group):
# ユーザIDとグループIDを取得
uid = pwd.getpwnam(user).pw_uid
gid = grp.getgrnam(group).gr_gid
for root, dirs, files in os.walk(path):
# ディレクトリの所有者変更
os.chown(root, uid, gid)
# ファイルの所有者変更
for file_name in files:
file_path = os.path.join(root, file_name)
os.chown(file_path, uid, gid)
if __name__ == "__main__":
directory = input("ディレクトリのパスを指定してください: ")
user = input("新しい持ち主のユーザ名を指定してください: ")
group = input("新しい持ち主のグループ名を指定してください: ")
change_owner_recursively(directory, user, group)
print(f"所有者が'{user}:{group}'に変更されました。")
pythonって、素晴らしい言語だな…