動画のタイトルに合わせて写真の名前を変更する

動画のタイトルに合わせて写真の名前を変更する

デフォルトでは、自動化されたメディアサーバーがあり、現在すべてがフォルダに入り、ファイル拡張子ごとに正しい場所に構成されています。

現在の写真名は「folder.jpg」で、映画の名前と一致するように名前を変更する必要があります。

現在の外観:前:

  • /目次/

    • フォルダ.jpg
    • 映画.mp4
    • 映画.xml

私が望む外観:以来:

  • /目次/

    • 映画.jpg
    • 映画.mp4
    • 映画.xml

jpgをmp4とどのように一致させますか?

答え1

努力する:

for movie in ./*/*.mp4; do mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"; done

${movie%/*}そして${movie%.mp4}それらはすべて例ですサフィックスの削除${movie%/*}ムービーファイルのあるディレクトリを返し、${movie%.mp4}拡張子を引いたムービーファイル名を返します.mp4

はい

ファイルを含む3つのディレクトリ、、、およびをdir1考慮dir2dir3てください。

$ ls -1 */*
dir1/Animal Crackers.mp4
dir1/Animal Crackers.xml
dir1/folder.jpg
dir2/folder.jpg
dir2/Monkey Business.mp4
dir2/Monkey Business.xml
dir3/Duck Soup.mp4
dir3/Duck Soup.xml
dir3/folder.jpg

次に、次のコマンドを実行します。

$ for movie in ./*/*.mp4; do mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"; done

コマンドを実行した後、ファイルは次のようになります。

$ ls -1 */*
dir1/Animal Crackers.jpg
dir1/Animal Crackers.mp4
dir1/Animal Crackers.xml
dir2/Monkey Business.jpg
dir2/Monkey Business.mp4
dir2/Monkey Business.xml
dir3/Duck Soup.jpg
dir3/Duck Soup.mp4
dir3/Duck Soup.xml

複数行バージョン

複数行にわたってコマンドを分散したい場合:

for movie in ./*/*.mp4
do
    mv -- "${movie%/*}/folder.jpg" "${movie%.mp4}.jpg"
done

答え2

find . -type f -name "*.mp4" -execdir bash -c ' [[ -f folder.jpg ]] && mv -v folder.jpg "$(basename {} .mp4).jpg"' \;

関連情報