bash 对不同的文件类型、目录中的所有文件执行不同的操作

bash doing different actions for different filetypes, for all files in directory

所以我想更改目录及其子目录中所有电影的元标题

for file in *; do 
if [[ $file == *.mkv ]]
then
    mkvpropedit --set "title=$file" "$file"; 
elif [[ $file == *.mp4 ]]
then
    exiftool "-Title<Filename" *.mp4 -overwrite_original -r
else
    echo "$file wrong filename"
fi
done

到目前为止,这是我的总体想法,但它没有找到文件。这些命令应该有效,但甚至没有输入 if 条件。同样仅使用 * 不搜索子目录。

您可以使用两个 find 命令:

find . -type f -name '*.mkv' -exec mkvpropedit --set "title={}" "{}" \;
find . -type f -name '*.mp4' -exec exiftool "-Title<Filename" "{}" -overwrite_original -r \;

第一个 find 递归地在工作目录中搜索任何名称以 .mkv 结尾的文件,然后运行以下命令(即,该命令是 [=15= 之间的所有内容) ] 和 \;),用文件名替换所有 {}

第二个 find 基本上做同样的事情,但对于名称以 .mp4.

结尾的文件

有关 find 的详细信息,请参阅 its Linux man page or the GNU manual


如果只想获取文件名来设置标题,可以使用以下方法:

find . -type f -name '*.mkv' -exec sh -c 'mkvpropedit --set "title=$(basename "")" ""' sh '{}' \;

basename 将路径作为参数,returns 只是路径的最后一部分(即目录名或文件名)。

sh -c 'mkvpropedit --set "title=$(basename "")" ""' sh '{}' 使用命令 mkvpropedit --set "title=$(basename "")" "" 运行 sh,其中命令的参数 (</code>) 是 <code>find 找到的文件名之一. (文件名以这种方式作为参数传递以避免命令注入。)

bash >= 4.0:

shopt -s globstar          # enable globstar
for file in **; do
  case "${file##*.}" in    # extract suffix
    mkv) echo "do something with $file"
         ;;
    mp4) echo "do something with $file"
         ;;
    *)   echo "unknown suffix at $file"
         ;;
  esac
done

此脚本将尝试递归地编辑指定目录中的所有相关文件:

#!/bin/sh

target_dir=${1:?no target dir provided}

cd "$target_dir" || exit 1

# pass the mkv file paths to a shell loop, to strip the leading path
find . -mindepth 1 -type f -iname '*.mkv' \
    -exec sh -c '
    for i; do
        name=${i##*/}
        mkvpropedit --set title="$name" "$i"
    done
    ' _ {} +

# exiftool can target specific extensions, and operate recursively
# use -r. to include hidden sub-directories
exiftool -r -ext mp4 -overwrite_original -Title'<Filename' .

/path/to/myscript /path/to/media-dir一样使用。

两个命令的文件扩展名都不区分大小写。

请记住,您可以使用 . 来定位当前目录。如果需要,您可以将脚本更改为默认使用当前目录,如果没有给出参数的话。

我用了sh。 bash 的写作是相同的。