2 番目のレベルのサブディレクトリで「1 レベル上に」ファイルを移動する

2 番目のレベルのサブディレクトリで「1 レベル上に」ファイルを移動する

デフォルトでは、1..M個のディレクトリ(DIRA-DIRZ)を含む親ディレクトリ(PARENT)があり、各ディレクトリには0..N個のディレクトリ(DIR1-DIRN)が含まれており、各ディレクトリにはファイルリスト(FILEa -FILEz )が含まれています。 。

PARENT/DIRA/DIR1/files
PARENT/DIRB/files
PARENT/DIRC/DIR2/files
PARENT/DIRC/DIR3/files

...セカンダリディレクトリ(DIR1-DIRN)が存在する場合は、ファイルをセカンダリディレクトリ(DIR1)からそれを含むプライマリディレクトリ(DIRA)に移動し、現在空のセカンダリディレクトリ(DIR1)を削除します。

PARENT/DIRA/files
PARENT/DIRB/files
PARENT/DIRC/files

私はこの作品を使用しようとしていることがわかりました。

find /thisdir -type f -name "*.ogg" -exec mv {} /somedir \;

ただし、外部ループとそれを統合する方法を理解することはできません。

提供できる助け、特に説明が役に立ちます!

ベストアンサー1

ほとんどすべてのLinuxディストリビューション(少なくともメジャーディストリビューション)にはPythonがプリインストールされているため、簡単なPythonスクリプトを書くのは簡単です。

#!/usr/bin/env python3
import sys
from pathlib import Path


def flatten_and_del(targdir):
    pardir = targdir.parent
    for f in targdir.glob("*"):
        f.rename(pardir / f.name)
    targdir.rmdir()


def process_dir(parent):
    parent = Path(parent)
    if not parent.is_dir():
        raise RuntimeError(f"{parent} is not a directory!")
    for f in parent.glob("*"):
        if not f.is_dir():
            continue
        flatten_and_del(f)


if __name__ == "__main__":
    process_dir(sys.argv[1])

たとえば、別の名前で保存し、tidy-dirs.py次のように実行します。

python3 tidy-dirs.py path/to/PARENT

警告する:αГsнιιがコメントで述べたように、このアプローチは〜するファイル名が競合すると、データが失われる可能性があります。これが発生しないようにするには、実行する前に確認をflatten_and_del追加してください。target.exists().rename()

おすすめ記事