gpt4 book ai didi

bash - ffmpeg遍历目录树,输出到不同根目录下的相同树,只处理一次文件

转载 作者:行者123 更新时间:2023-12-04 23:22:37 28 4
gpt4 key购买 nike

我希望 ffmpeg 不断循环遍历一个目录结构以查找 *.webm 文件,然后在找到时将它们转换为 mp4,将它们输出到不同路径下的相同子目录结构。子目录/文件会自动添加到树中。我可以手动执行此操作,但我的脚本尝试失败了,我正在使用 ionotify 事件脚本来查找新目录并重新运行转换脚本,但它不会连续运行。我也不想在文件转换后再次处理它。
我在每个 inotify 中使用这个调用:

find /opt/media/ -name "t_str_*.webm" -exec bash -c \
'ffmpeg -loglevel panic -acodec libopus -i $0 -strict experimental -movflags faststart ${0/webm/mp4}' {} \;
我有以下目录结构,子目录是字母数字的。
资源:
parent1
- AAAAAA
- file1.webm
- BBBBBB
- file2.webm
- CCCCCC
- file3.webm
- ZZZZZZ
- file4.webm
目的地:
parent2
- AAAAAA
- file1.mp4
- BBBBBB
- file2.mp4
- CCCCCC
- file3.mp4
- ZZZZZZ
- file4.mp4
有什么建议么?

最佳答案

此脚本在 parent1 中查找新目录如果有一个扩展名为 *.webm 的新文件然后运行 ​​ffmpeg您已针对它发布并创建相同的目录结构并转移到parent2*.mp4扩大。

#!/usr/bin/env bash

find /opt/media/parent2 -type f -name '*.mp4' > parent2_files.txt

fifo="${TMPDIR:-${XDG_RUNTIME_DIR:-/tmp}}/fifo.$$"
trap 'rm -rf "$fifo"' EXIT
mkfifo "$fifo" || exit

check_file() {
find /opt/media/parent1 -type f -name '*.webm' -exec sh -c '
for f; do
f=${f/parent1/parent2}
f=${f%.webm}.mp4
echo "$f"
done
' _ {} + | grep -Fvwf parent2_files.txt
}

monitor() {
while read -r events file; do
if [[ $events == CREATE && $file == *.webm ]]; then
return
fi
done
}

inotifywait -mrq --format '%e %f' -e create /opt/media/parent1 > "$fifo" & pid=$!

monitor < "$fifo"
kill "$pid"
wait

while read -ru 9 parent2; do
mkdir -p "${parent2%/*}"
parent1=${parent2/parent2/parent1}
parent1=${parent1%.mp4}.webm
ffmpeg -loglevel panic -acodec libopus -i "$parent1" -strict experimental -movflags faststart "$parent2"
done 9< <(check_file)

"$0"
默认目录结构。
/opt/
└── media
├── parent1
│   ├── AAAAAA
│   │   └── file1.webm
│   ├── BBBBBB
│   │   └── file2.webm
│   ├── CCCCCC
│   │   └── file3.webm
│   └── ZZZZZZ
│   └── file4.webm
└── parent2
├── AAAAAA
│   └── file1.mp4
├── BBBBBB
│   └── file2.mp4
├── CCCCCC
│   └── file3.mp4
└── ZZZZZZ
└── file4.mp4
如果在 parent1 中添加了新目录
/opt/
└── media
├── parent1
│   ├── AAAAAA
│   │   └── file1.webm
│   ├── BBBBBB
│   │   └── file2.webm
│   ├── CCCCCC
│   │   └── file3.webm
│   ├── GGGGGG
│   │   └── file8.webm
│   ├── NNNNNN
│   │   └── file9.webm
│   ├── PPPPPP
│   │   └── file7.webm
│   ├── TTTTTT
│   │   └── file6.webm
│   ├── XXXXXX
│   │   └── file5.webm
│   └── ZZZZZZ
│   └── file4.webm
剧本之后。
/opt/
└── media
├── parent1
│   ├── AAAAAA
│   │   └── file1.webm
│   ├── BBBBBB
│   │   └── file2.webm
│   ├── CCCCCC
│   │   └── file3.webm
│   ├── GGGGGG
│   │   └── file8.webm
│   ├── NNNNNN
│   │   └── file9.webm
│   ├── PPPPPP
│   │   └── file7.webm
│   ├── TTTTTT
│   │   └── file6.webm
│   ├── XXXXXX
│   │   └── file5.webm
│   └── ZZZZZZ
│   └── file4.webm
└── parent2
├── AAAAAA
│   └── file1.mp4
├── BBBBBB
│   └── file2.mp4
├── CCCCCC
│   └── file3.mp4
├── GGGGGG
│   └── file8.mp4
├── NNNNNN
│   └── file9.mp4
├── PPPPPP
│   └── file7.mp4
├── TTTTTT
│   └── file6.mp4
├── XXXXXX
│   └── file5.mp4
└── ZZZZZZ
└── file4.mp4
  • 这个脚本背后的想法来自 Bash FAQ117
  • 关于bash - ffmpeg遍历目录树,输出到不同根目录下的相同树,只处理一次文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62500816/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com