我不是 shell 專家,我想知道如何撰寫一個小演算法(我認為這是可能的)來解決我的問題。
我有一個output它本身包含例如幾個檔案夾目錄data_1,data_2等等。這些檔案夾中還包含不同的版本,例如version_1,version_2。最后這些版本都包含一個影像檔案夾photos包含表單幾千個影像000001.jpg,000002.jpg......我希望所有這些轉換photos檔案夾成一幀需要的照片幀的視頻。例如,對于資料集的第二個版本,data_1我將執行以下命令:
ffmpeg -i data_1/version_1/photos/m.jpg data_1/version_1/data_1_ version_1.mov
rm -r data_1/version_1/photos
但這意味著一旦檔案夾的程式完成后,我必須通過更改檔案夾名稱和 .mov 檔案手動重寫命令,該檔案必須采用 data_version.mov 形式并保存在 data/version/data_version 中。移動
我想要一個腳本,它通過遍歷所有data檔案夾來創建視頻來自動執行此程序,但還要檢查視頻是否存在,腳本是否未在當前version.
預先感謝您的任何幫助
uj5u.com熱心網友回復:
假設目錄名稱photos是固定的,請您嘗試:
while IFS= read -r dir; do # assign "dir" to the path to "photos"
dir2=${dir%/photos} # remove trailing "photos" dirname
name=${dir2#*/} # remove leading slash
name=${name//\//_} # convert slashes to underscores
echo ffmpeg -i "$dir/m.jpg" "$dir2/${name}.mov" # execute ffmpeg
echo rm -rf -- "$dir" # rm "photos" directories
done < <(find . -type d -name "photos") # find dir named "photos" recursively
如果輸出看起來不錯,則洗掉echo并執行。
uj5u.com熱心網友回復:
我會使用 glob 擴展而不是使用find,因為它更容易和更便攜以匹配特定路徑;其余的幾乎與@tshiono 的回答相同。
#!/bin/bash
shopt -s nullglob extglob
photos_dirpaths=(data_ ([[:digit:]])/version_ ([[:digit:]])/photos/)
if [ ${#photos_dirpaths[@]} -eq 0 ]
then
echo 'error: run this script inside the output directory' 1>&2
exit 1
fi
for dirpath in "${photos_dirpaths[@]%/}"
do
filepath="${dirpath%/photos}"
filename="${filepath//\//_}.mov"
echo ffmpeg -i "$dirpath/m.jpg" "$filename"
# or?
echo ffmpeg -i "$dirpath/m.jpg" "$filepath/$filename"
[ $? -eq 0 ] && echo rm -rf "$dirpath"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359517.html
