终端选择多个文件并传入.sh脚本

终端选择多个文件并传入.sh脚本

我正在编写一个 .sh 脚本,该脚本允许我有选择地挑选文件夹中的文件,然后将这些文件作为变量传递到脚本中,.sh以便我可以在其上进行编辑。

#!/bin/bash
filesList=""
for file in $(ls -1v *.MP4);do #lists even numbered file
    filesList="${filesList}${file}|"
done
filesList=${filesList%?} # removes trailing pipe
ffmpeg -i "concat:$filesList" -c copy ../$(date +%Y%m%d_%H%M%S)_merged.mp4

目前我有上述脚本,但有时有些*.MP4文件我不想包含在作业中。

答案1

这可能不是您的问题的直接解决方案,但有时值得探索替代方法。

如果您想以交互方式选择文件并将其导入脚本,请查看fzf。您可以使用它从文件列表中选择单个文件,然后处理输出。例如:

find . -type f -iname '*.mp4' | fzf -m

这将向您显示一个文件列表,您可以对其进行模糊搜索(通过输入字母),并使用Tab或进行标记/取消标记ShiftTab

按下后Enter,您将获得一个以换行符分隔的文件名列表,您可以将其通过管道传输到另一个程序,例如xargs您自己的 shell 脚本。


我主要用fzf它来扩展**文件的递归列表以进行模糊查找,以及它的CtrlR功能,它让我可以以模糊的方式搜索命令历史记录。

因此,您也可以尝试启用键盘快捷键,然后键入简单的**,然后Tab启动fzf

答案2

排除任意文件的一般方法可能是这样的:

  1. 创建项目目录 – mkdir pdir
  2. 硬链接您的脚本将对其操作的所有文件 – cp -l -- *.MP4 pdir/
  3. 进入目录 – cd pdir
  4. 使用rmmcvidirdolphin任何其他方式删除要排除的文件。您还可以重命名文件(以影响排序)。
  5. 运行脚本。
  6. 将结果保存到其他地方。
  7. 离开项目目录并将其删除(连同其内容)。

在原始目录中,所有文件仍保留其原始名称。


笔记:

  • 这行

    for file in $(ls -1v *.MP4); do
    

    正是Bash 陷阱 1。它可能适用于您使用的特定文件名。我想这不是您的主要问题(如果有的话)。

  • concat 协议不应与 MP4 一起使用。你现在应该知道了

相关内容