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 的写作是相同的。
所以我想更改目录及其子目录中所有电影的元标题
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 的写作是相同的。