批处理文件转换为Linux脚本

批处理文件转换为Linux脚本,linux,cmd,Linux,Cmd,由于将批处理作业迁移到Linux服务器,我在Linux中找不到与以下命令等效的命令: Y驱动器是NAS驱动器的映射驱动器,该驱动器也连接到Ubuntu服务器/NAS/CCTV。需要在每个子文件夹中搜索所有.264文件 Z驱动器在Ubuntu服务器上。只需将每个.mp4文件移到这里,这里没有文件夹。Ubuntu上的路径是/Share/CCTV/ 这只是一个简单的脚本,可以将cctv capture.264格式转换为mp4,并移动到要处理的服务器,删除任何h264文件和任何超过1天的文件夹,脚本将计

由于将批处理作业迁移到Linux服务器,我在Linux中找不到与以下命令等效的命令:

Y驱动器是NAS驱动器的映射驱动器,该驱动器也连接到Ubuntu服务器/NAS/CCTV。需要在每个子文件夹中搜索所有.264文件

Z驱动器在Ubuntu服务器上。只需将每个.mp4文件移到这里,这里没有文件夹。Ubuntu上的路径是/Share/CCTV/

这只是一个简单的脚本,可以将cctv capture.264格式转换为mp4,并移动到要处理的服务器,删除任何h264文件和任何超过1天的文件夹,脚本将计划每3分钟运行一次

我在Ubuntu服务器上安装了ffmpeg,只是在文件夹中找不到每个文件的相同文件

也适用于删除超过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服务器上重写它。我确实尝试搜索for循环,但都显示要计数,可能我搜索错误。

查找所有.h264文件(递归)
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 {} \;
将所有此类文件转换为.mp4 删除旧目录(递归) 文档
find
命令根据指定的条件递归列出文件。每当您需要处理多个目录中的文件或大量文件时,它可能就是您想要使用的。为了安全防范恶意文件名,重要的是
-print0
,因此文件名由null而不是换行符分隔,这需要使用
IFS=read-d'
构造稍后进行解释

读取变量时的
;做完成
construct从输入读取数据,并将每条记录分配给命名变量。这允许在循环中一次处理一个匹配的文件。循环的内部应该相当明显

再次使用
find
选择文件,但在本例中,文件是目录。开关
-not-newer
根据其
m
时间(与
t
相比的修改时间)选择
not
更新的文件(换句话说,较旧的文件),在这种情况下,下一个参数是描述时间的文本。在这里,您可以使用GNU
date
-d
开关可以理解的任何表达式,因此我可以用简单的英语编写,它将按预期工作

在开始编写shell脚本的过程中,您应该做好两件事:

  • -始终运行通过shellcheck编写的脚本以捕获基本错误
  • -wooledge.org上的bash常见问题解答。大多数你还没有想到的问题的答案都会在这里。例如,与这个问题高度相关

我发现了一些类似的东西,并对其进行了一些修改,使其看起来像这样,但尚未对其进行测试。如果是错的,请纠正我。对于h264中的i;执行ffmpeg-i“$i”“${i%.}.mp4”;您好,谢谢回复,第一行没有显示这样的文件或目录,但是如果我将其更改为它能够找到的实际路径并转换为mp4格式,我是否需要任何额外的参数,以便它可以搜索子目录或更深层的目录/NAS/CCTV/subdir1/subdir2/subdir3/../其中子目录2和3是日期和时间
/NAS/CCTV/*。h264
是当前目录中的唯一文件。对于递归搜索,您需要使用find。见索皮格尔的回答
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)
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 {} +