0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pythonはファイルのために、再帰処理を書かなくていいらしい

Last updated at Posted at 2024-09-09

(この記事は、眠たい私がハイになりつつ書いたため、テンションがおかしいですがお許しください)

このディレクトリの中のファイル、権限とかを全部書き換えたいなあ…
でも再帰処理とかめんどいな〜
とか思っているそこの君! os.walkを知っているかい!

os.walkとは

ディレクトリツリーをたどって、すべてのフォルダ、ファイルをなぞることを、for文だけで実装できるようにしてくれる素晴らしいメソッド

os.walkの引数、戻り値

引数

top
最初のディレクトリ、一番最初になぞることとなる
ここから下のディレクトリ、ファイルをなぞることになる

戻り値

dirpathdirnamesfilenames
それぞれ「現在のディレクトリ(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文だけですべて完結させてくれる!すっげえ!
なんて革新的!

使用例

  1. 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って、素晴らしい言語だな…

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?