デフォルトでは、ディレクトリを検索し続けるスクリプトを検索しようとしますが、スクリプトがファイルを見つけると、.flac
同じフォルダにFLACというサブフォルダを作成し、.flac
ファイルをそのディレクトリに移動します。同じディレクトリに30個のflacファイルを見つけることができるので、フォルダがすでに存在することに気づき、競合が発生したくありません。
フォルダ/ファイルレイアウトの例:
デフォルトパスは
/files/music
現在のサブディレクトリは次のとおりです。
/files/music/artist /files/music/artist/album1 /files/music/artist/album2
ファイルは次のように表示されます。
/files/music/artist/album1/01-song 1.mp3 /files/music/artist/album1/01-song 1.flac /files/music/artist/album1/02-another song.mp3 /files/music/artist/album1/02-another song.flac /files/music/artist/album2/01-yet another.mp3 /files/music/artist/album2/01-yet another.flac
だから本質的に私はそれが次のようになりたいと思います:
/files/music/artist/album1/01-song1.mp3 /files/music/artist/album1/02-another song.mp3 /files/music/artist/album1/flac/01-song 1.flac /files/music/artist/album1/flac/02-another song.flac /files/music/artist/album2/01-yet another.mp3 /files/music/artist/album2/flac/01-yet another.flac
全体的なアイデアは、多くのCDをスキャンした後に混合バージョンを含むフォルダがたくさんあることです。したがって、メディアプレーヤーは最終的に曲を2回再生します(最初にmp3バージョン、次にflacバージョン)。 。
mp3ファイルが存在しない場合は、ディレクトリを残すスクリプトを作成できますか? (flacのみ?)したがって、フォルダに.flacファイルしかない場合、サブフォルダは作成されず、そのまま残ります。私が見る唯一の問題は、フォルダに別のファイル(jpgカバーファイルなど...)がある可能性があるため、mp3ファイルを見つける必要があることです。
ベストアンサー1
単純なバージョンでは、常にflac
サブディレクトリを作成しmp3
(空でない場合)、find
必要に応じてコマンドを使用してサブディレクトリを作成し、そこにファイルを移動するスクリプトを実行します。
find . -name '*.mp3' -o -name '*.flac' -exec sh -c 'mkdir -p "${0%/*}/${0##*.}" && mv "$0" "${0%/*}/${0##*.}"' {} \;
シェルコードスニペットを実行する各ファイルのファイル$0
パスは、${0%/*}
ディレクトリ部分、${0##*.}
拡張子はです。
set -o globstar
または、bash(または代替のあるksh93または代替のshopt -s globstar extglob
ないzsh)では、次のように使用します。setopt ksh_glob
**
模様:
shopt -s globstar extglob
for x in **/*.@(mp3|flac); do
mkdir -p "${x%/*}/${x##*.}" && mv "$x" "${x%/*}/${x##*.}"
done
それでは、すべてのファイルの拡張子が同じ場合は、サブディレクトリを生成しないバージョンを作成しましょう。ここでは、ディレクトリを繰り返す方が簡単です。これはbash用です(ksh93またはzshに適用可能)。各ディレクトリで、スクリプトはすべてのファイルのリストを収集します(上記の.
.flac ..), all
.mp3 files and all
flac`files in arrays. If there is at least one flac file and at least one non-flac files, move the flac files to a
サブディレクトリを除く。mp3ファイル)。
shopt -s globstar nullglob; GLOBIGNORE=.:..
start_wd=$PWD
for dir in "$PWD"/**/*/; do
cd "$dir"
files=(*)
flac_files=(*.flac)
mp3_files=(*.mp3)
if ((${#flac_files[@]} > 0 && ${#flac_files[@]} < ${#files[@]})); then
mkdir flac && mv "${flac_files[@]}" flac/
fi
if ((${#mp3_files[@]} > 0 && ${#mp3_files[@]} < ${#files[@]})); then
mkdir mp3 && mv "${mp3_files[@]}" mp3/
fi
done
cd "$start_wd"