デフォルトでは、自動化されたメディアサーバーがあり、現在すべてがフォルダに入り、ファイル拡張子ごとに正しい場所に構成されています。
現在の写真名は「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
考慮dir2
しdir3
てください。
$ 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"' \;