ファイル形式を移動してサブフォルダがある場合は、サブフォルダを生成するスクリプトはありますか?

ファイル形式を移動してサブフォルダがある場合は、サブフォルダを生成するスクリプトはありますか?

デフォルトでは、ディレクトリを検索し続けるスクリプトを検索しようとしますが、スクリプトがファイルを見つけると、.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 allflac`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"

おすすめ記事