linux - 批处理文件转换为 Linux 脚本

标签 linux cmd

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

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

Z 驱动器 位于 Ubuntu 服务器本身。只需将每个 .mp4 文件移到此处,此处没有文件夹。 Ubuntu 上的路径是/Share/CCTV/

它只是一个简单的脚本,用于将 cctv 捕获的 .264 格式转换为 mp4 并移至服务器进行处理并删除任何 h264 文件和任何超过 1 天的文件夹,该脚本将安排每 3 分钟运行一次。

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

还有删除超过 1 天的文件夹的最后一个 for files 命令

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 文件(递归)

find /NAS/CCTV -type f -name '*.h264'

将所有此类文件转换为 .mp4

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 这样的名字.

同时将那些 mp4 文件移动到另一个目录

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因此文件名由 null 而不是换行符分隔,这需要使用 IFS= read -d ''构建以供稍后解释。

while read variable ; do ... done构造从输入中读取数据并将每个记录分配给命名变量。这允许在循环内一次处理每个匹配文件。循环的内部应该是相当明显的。

再次 find用于选择文件,但在本例中文件是目录。开关 -not -newer选择 not 的文件newer (换句话说,旧文件)根据他们的 m time,修改时间,与t相比,在这种情况下意味着下一个参数是描述时间的文本。在这里你可以使用 GNU 理解的任何表达式 date-d switch,所以我可以用简单的英语写,它会按预期工作。

在您开始 shell 脚本编写之旅时,您应该随身携带两件东西:

  • shellcheck - 始终通过 shellcheck 运行您编写的脚本以捕获基本错误。
  • Bash FAQ - wooledge.org 上的 bash 常见问题解答。大多数您尚未想到的问题的答案都将在这里。例如FAQ 15与这个问题高度相关。

关于linux - 批处理文件转换为 Linux 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51347112/

相关文章:

python - 如何以特定用户身份调用 Python 脚本中存在的命令

linux - 通过 ssh 执行的管道命令的退出状态

windows - 删除空行

java - 在计划模式下执行bat文件(java程序)后命令提示符未退出

java - Hadoop 2.6.0 HDFS 输出文件夹

linux - 如何在 Linux 上使用 Vtune Analyzer API

c - 如何使用 libnl-route 设置 netem qdisc 和 tbf qdisc?

windows - 如何在 MS Windows 中更改 "local system"帐户的 %PATH% 值?

如果不提供 ".exe",Cmd 无法运行我的可执行文件

java - 命令提示符中不存在包