Bash

如何遍歷所有目錄和子目錄並查找具有特定副檔名的文件,然後在它們上執行 FFMPEG,然後將它們複製到新的庫中

  • August 28, 2022

我一直在研究今天和昨天的所有內容,試圖找到一個解決方案,到目前為止沒有一個對我有用。

例如:https ://stackoverflow.com/questions/5784661/how-do-you-convert-an-entire-directory-with-ffmpeg

我希望能夠遍歷文件夾中的所有文件(例如/Music/),在以 結尾的任何目錄或子目錄中查找任何文件.flac,然後使用以下命令將這些 flac 文件轉換為 alac 文件:

ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"

$i 變數是 for 循環中文件的“名稱”。${i%.*}應該只返回名稱,而不是 .flac 部分。

無論如何,在該命令執行後,我希望所有保存的 .m4a alac 文件然後被發送到“新庫”…… IE:我將有兩個/Music/庫。

一個有所有的flac文件

一個擁有所有 alac (m4a) 文件

這可能嗎?

這是我到目前為止的命令,絕對不起作用,即使它起作用,它也不會像我想要的那樣創建一個新庫:for i in *.flac; do ffmpeg -i "$i" -c copy -acodec alac "${i%.*}.m4a"; done

目前該命令只是拋出錯誤*.flac: No such file or directory,我認為這是因為它沒有搜尋子目錄?…

#!/bin/bash

shopt -s globstar

src_dir="Music"
dest_dir="Music_new"

for orig_path in "${src_dir}"/**/*.flac; do
   #Change first directory in the path
   new_path=${orig_path/$src_dir/$dest_dir}

   #Remove filename from new path. Only directories are left.
   #They are needed for mkdir
   dir_hier=${new_path%/*}

   #Remove extension .flac from path, thus we have original path with first directory
   #changed and file extension removed.
   #Original path:   "Music/one/two/song.flac"
   #New path:        "Music_new/one/two/song"
   new_path=${new_path%.*}

   echo mkdir -p "$dir_hier"

   #New path with extension:   "Music_new/one/two/song.m4a"
   #ffmpeg should create new file by this path, necessary directories
   #already created by mkdir
   echo ffmpeg -i "$orig_path" -c copy -acodec alac "${new_path}.m4a"
done

echo之前mkdirffmpeg檢查後應刪除。

引用自:https://unix.stackexchange.com/questions/715219