我有很多帶有 .mp4 檔案的檔案夾。我撰寫了一個腳本,它獲取 mp4 檔案并將它們轉換為每幀 1 個 jpeg 影像。至關重要的是,此腳本的輸出(保留的檔案名,末尾附加 _frame 編號)進入一個新創建的檔案夾,其檔案基名為:
#!/bin/bash
for f in *.mp4; do mkdir -p "${f%.*}" && ffmpeg -i ${f} -start_number 000 "${f%.*}/${f}_d.jpg"; done
我可以一次為每個父檔案夾運行一個沒有問題,但我想只運行一次并讓它遞回運行。
我將代碼更改為:
#!/bin/bash
for f in *.mp4/; do mkdir -p "${f%.*}" && ffmpeg -i ${f} -start_number 000 "${f%.*}/${f}_d.jpg"; done
并嘗試使用 mkdir 部分(通過添加 ./),但無論我做什么,我都會收到以下錯誤。
mkdir: 無法創建目錄 '*': 無效引數
我需要做些什么來允許 mkdir 在其各自的子檔案夾中創建適當的新檔案夾嗎?
檔案結構如下:
parent folder
└── videos_1
├── videos_1_basename_1.mp4
└── videos_2_basename_2.mp4
└── videos_2
├── videos_2_basename_1.mp4
└── videos_2_basename_2.mp4
.sh script
uj5u.com熱心網友回復:
您可以使用globstarbash 選項在子目錄中進行遞回,也可以使用該選項nullglob使模式擴展為 null 而不是自身(錯誤的原因在另一個答案中解釋):
#!/usr/bin/env bash
shopt -s globstar nullglob
for f in **/*.mp4; do
d=${f%.mp4}
b=$(basename -s.mp4 "$f")
if mkdir -p "$d"; then
ffmpeg -i "$f" -start_number 000 "$d/${b}_d.jpg"
else
printf 'could not mkdir %s\n' "$d"
fi
done
注意:對于名為:
videos_1/videos_1_basename_1.mp4
這將創建名為:
videos_1/videos_1_basename_1/videos_1_basename_1_000.jpg
videos_1/videos_1_basename_1/videos_1_basename_1_001.jpg
...
如果您真的想在名稱中保留.mp4擴展名:
videos_1/videos_1_basename_1/videos_1_basename_1.mp4_000.jpg
...
-s.mp4只需洗掉basename.
uj5u.com熱心網友回復:
建議使用find命令獲取*.mp4當前目錄下的所有內容。
#!/bin/bash
for currFile in $(find -name "*.mp4"); do
currDir="${currFile %.mp4}"
mkdir -p "$currDir"
ffmpeg -i "$currFile " -start_number 000 "$currDir/${currFile}_d.jpg"
done
uj5u.com熱心網友回復:
*.mp4/由于附加了. ,將擴展到名稱以 . 結尾的/所有目錄.mp4。如果您沒有具有這樣名稱的目錄,則不會獲得任何通配符擴展。f因此設定為字串*.mp4/并${f%.*}產生一個 lone *,因為您可以在命令列上自己嘗試。似乎mkdir拒絕創建具有如此奇怪名稱的目錄;我會認為這是一個功能而不是一個錯誤。
您的代碼中沒有關于目錄的遞回。你可以做一個
for f in videos_*/*.m4a
在您的父檔案夾中。當然f,隨后還會包含相應子目錄的名稱(例如videos_1/videos_1_basename_1.m4a),您必須根據這一事實調整您的腳本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/447749.html
上一篇:洗掉檔案命令不適用于空間名稱
