Debian コンピュータで自分のムービーフォルダを再構築しようとすると、最終的に次のような構造になりました。
├── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p)
│ └── Universal.Love(2017)(1080p).mkv
│ └── Universal.Love(2017)(1080p).mkv.mkv
├── Unknown.User.2014.German.DTS.DL.1080p.BluRay.x264-EXQUiSiTE
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p
│ └── exq-unknownuser-1080p.mkv
├── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES
│ └── Unsane.2018.1080p.BluRay.x264-DRONES.mkv
├── Untitled (2017)
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p
│ └── Untitled.2017.WEBDL-1080p.mkv
1つのサブフォルダにのみ.mkvを持つことはできますか?
答え1
shopt -s globstar nullglob
for dir in ./*/; do
for file in "$dir"/**/*.mkv; do
[ ! -f "$file" ] && continue
mv -i "$file" "$dir"
done
done
上記の二重ループで問題を解決することができます。
これは、現在のディレクトリ(これらすべての最上位ディレクトリを保持するディレクトリと見なされます)のディレクトリを繰り返し実行します。各ディレクトリに対して、.mkv
そのディレクトリの下のすべてのファイルがサブディレクトリに移動されます。これは、サブディレクトリが再帰的に一致する**
globsを介して行われます。bash
シェルの有効化globstar
オプションが機能し**
、nullglob
与えられたパターンに一致するものがない場合、ループはまったく実行されません。
その後、次のコマンドを使用して空のディレクトリを削除できます。
find . -type d -empty -delete
答え2
この試み、
find . -mindepth 3 -type f -name "*.mkv" -exec sh -c '
f="$1"; IFS=/ && set -- $f; echo mv -t "$2" "$f"
' find-sh {} \;
(最初のサブフォルダを見つける方法:渡す)
echo
出力確認時に削除されました。
これにより、構造内の2レベルより深いすべての* .mkvファイルが現在のディレクトリの最初のサブディレクトリに移動されます。
その後、空のディレクトリを削除できます。
find . -type d -empty -delete
答え3
この試み、
find . -maxdepth 1 -type d ! -name '.' | while read -r folder; do
find $folder -type f -name '*.mkv' -exec mv {} $folder \;
find $folder -type d -empty -delete
done
- 最初のエントリは
find
すべてのホームディレクトリのリストを取得します。 - 2 番目の手順では、
find
利用可能な .mkv ファイルをホーム ディレクトリに移動します。 - 3番目のステップ
find
では、ホームディレクトリのすべての空のディレクトリを削除します。
find
注:3番目の項目をループの外に移動して、while
すべての空のディレクトリを一度に削除することもできます。