Shell: 在变量列表上使用 for

Shell: use of for on a variable list

不幸的是,我的 shell 技能很差,我需要一些帮助 运行 在我的 QNAP 上安装一个简单的脚本来修复某些视频的日期问题。

我写的脚本很简单:

  1. 在给定的文件夹中
  2. 检查是否有以VID_开头的.mp4文件
  3. 如果是这样,对于每个 运行 给定的 exiftool 命令

这是到目前为止的脚本,但我想我没有使用正确的方式调用变量:

#!/bin/sh

# set target directories
dir="/share/Multimedia/Pictures/"

# move to target directory
cd "$dir"

# check if there is some .mp4 file starting with "VID_" in the folder

VID=$(ls -A $dir | grep 'VID_' | grep './mp4')

if
    ["$VID"];

then

    # for each file in the list
    for f in $VID

        do

        # change all date metadata according to its filename
        exiftool "-*date<filename" -wm w $f

done

else

fi

感谢您的帮助!

ps: exiftool 指令是正确的(可能除了变量)

您的代码可能由于使用而失败:

grep './mp4'

因为mp4之前没有/

最好将脚本设置为:

#!/bin/sh

# set target directories
dir="/share/Multimedia/Pictures/"

# move to target directory
cd "$dir"

for f in VID_*.mp4; do
   exiftool "-*date<filename" -wm w "$f"
done

这里不需要解析 ls 的输出,也不需要使用 grep,因为 glob VID_*.mp4 会找到正确的文件。

不需要为此编写脚本,这样做只会减慢您的速度,因为您必须为每个文件调用 ExifTool。 ExifTool 可以一次完成所有文件:
ExifTool -ext mp4 '-*date<filename' -wm w /path/to/dir/VID_*

-ext mp4 选项将命令限制为仅 mp4 文件。由于您似乎在 linux/mac 系统上,因此必须将双引号更改为单引号。 Windows 系统需要双引号,linux/mac 系统需要单引号。