1つのファイルしかないサブディレクトリを検索し、ファイルを1レベル上の親ディレクトリに移動する方法

1つのファイルしかないサブディレクトリを検索し、ファイルを1レベル上の親ディレクトリに移動する方法

したがって、複数のサブディレクトリがあり、そのほとんどはファイルが1つだけで、ファイル名はサブディレクトリ名と同じです。

DIR A
--DIR B
----B.zip
--DIR C
----C2.zip
----C3.zip
--DIR D
----D.zip

したがって、理想的な結果は次のとおりです。

  1. 両方B.zipD.zip次へDIR A
  2. DIR B今はDIR D空なので削除する必要がありますが、DIR C2つ以上のファイルが含まれているので、そのままにしてください。

できることはありますか?それとも特別なプログラミングコードを書く必要がありますか?

ありがとう

ベストアンサー1

ディレクトリツリーをGNU findナビゲートしながら情報を収集するユーティリティを使用します。 -深度オプションを使用すると、findはツリーの深さ優先巡回を実行し、正確に1つの一般的なファイルを格納するディレクトリの名前を取得します。次に、ファイルをabd tgenの上に移動し、空のディレクトリを削除します。

find . -depth ! -name . -type d -execdir \
sh -c '
  isFileKnt_1() {
    test "$(cd "$1" && find . -maxdepth 1 -type f | grep -c /)" -eq 1
  }
  for d do 
    t=$(mktemp -d)
    isFileKnt_1 "$d" || exit 0
    mv "$d"/* "$t"/.
    rmdir "$d"
    mv "$t"/* .
  done
' find-sh {} +

tree -F はジョブの前後の結果を出力します。

.
├── dirB/
│   └── dirB
├── dirC/
│   ├── file_2
│   └── file_3
└── dirD/
    └── dirD
.
├── dirB
├── dirC/
│   ├── file_2
│   └── file_3
└── dirD

おすすめ記事