由于将批处理作业迁移到Linux服务器,因此在查找Linux中以下命令的等效项时遇到问题:
Y驱动器是NAS驱动器的映射驱动器,该NAS驱动器也已连接到Ubuntu服务器/ NAS / CCTV。需要在每个子文件夹中搜索所有.264文件
Z驱动器在Ubuntu服务器本身上。只需将每个.mp4文件移到此处,这里就没有文件夹。 Ubuntu上的路径是/ Share / CCTV /
这只是一个简单的脚本,可以将CCTV捕获.264格式转换为mp4,然后移至服务器进行处理,并删除所有h264文件和任何早于1天的文件夹,该脚本将计划每3分钟运行一次。
我在Ubuntu服务器上安装了ffmpeg,只是无法找到文件夹中每个文件的ffmpeg来做同样的事情。
最后一个for files命令删除超过1天的文件夹
FOR /r y:\ %%F in (*.h264) do c:\scripts\ffmpeg -i %%F %%F.mp4
FOR /r y:\ %%F in (*.h264) do del %%F
FOR /r y:\ %%G in (*.mp4) do move %%G Z:\
forfiles -p "Y:\" -d -1 -c "cmd /c IF @isdir == TRUE rd /S /Q @path"
感谢任何形式的帮助,或向我指出正确的指南,以便可以在Linux服务器上重写它。我确实尝试搜索循环,但都显示计数,可能是我搜索错误。
答案 0 :(得分:0)
for f in /NAS/CCTV/*.h264; do ffmpeg -i "$f" "$f".mp4; done
rm /NAS/CCTV/*.h264
mv /NAS/CCTV/*.mp4 /Share/CCTV
find /NAS/CCTV/ -type d -ctime +1 -exec rm -rf {} \;
答案 1 :(得分:0)
<ul class="nav nav-pills">
<li class="nav-item">
<a class="nav-link" href="#">Active</a>
</li>
...
</ul>
find /NAS/CCTV -type f -name '*.h264'
请注意,这将创建名为while IFS= read -d '' -r file ; do
ffmpeg -i "$file" "$file".mp4
done < <(find /NAS/CCTV -type f -name '*.h264' -print0)
的文件。这符合您的批处理文件行为。如果您想替换扩展名,请改用filename.h264.mp4
,您将得到一个类似ffmpeg -i "$file" "${file%.*}".mp4
的名称。
filename.h264
while IFS= read -d '' -r file ; do
ffmpeg -i "$file" "$file".mp4
if [[ -f $file.mp4 ]] ; then
mv -f -- "$file".mp4 /Share/CCTV
fi
done < <(find /NAS/CCTV -type f -name '*.h264' -print0)
find /NAS/CCTV -type d -not -newermt '1 day ago' -exec rm -rf {} +
命令根据您指定的条件递归列出文件。每当您需要处理多个目录中的文件或大量文件时,它可能就是您想要使用的。为了防止恶意文件名的安全,重要的是find
,因此文件名以空而不是换行符分隔,然后需要使用-print0
构造来稍后解释。
IFS= read -d ''
构造从输入中读取数据,并将每个记录分配给命名变量。这允许在循环内一次处理每个匹配文件。循环的内部应该非常明显。
同样,while read variable ; do ... done
用于选择文件,但是在这种情况下,文件是目录。开关find
根据-not -newer
时间(即修改时间)与{{1}比较,选择not
newer
的文件(换句话说,是较旧的文件) }},在这种情况下,意味着下一个参数是描述时间的文本。在这里,您可以使用GNU m
的{{1}}开关可以理解的任何表达式,因此我可以用简单的英语编写,它将按预期工作。
在进行Shell脚本编写之旅时,您应该将两件事放在身边: