【发布时间】:2022-01-23 09:48:12
【问题描述】:
我有这些测试文件:
ABCD1234__12_Ab2_Hh_3P.mp4
ABCD1234__12_Ab2_Lw_3P.wmv
ABCD1234__12_Ab2_SSV.mov
EFGH56789__13_Mn1_SSV.avi
EFGH56789__13_Mn1_Ve1_3P.mp4
EFGH56789__13_Mn1_Ve2_3P.webm
我想在 Automator 中创建一个上下文服务,它根据上面的文件名前缀创建目录,如下所示:
ABCD1234__12_Ab2
EFGH56789__13_Mn1
...并相应地将文件移动到这两个中。名称中唯一一致的变量是下划线,所以我想我可以用这些来描述,最好在第四个之前捕获名称。
我最初是从这个非常简单的脚本开始的:
for file in "$@"
do
mkdir "${file%.*}" && mv "$file" "${file%.*}"
done
它为每个文件创建一个文件夹并将每个文件移动到自己的文件夹中。
我尝试添加变量、各种 if/then 等,但无济于事(不是职业程序员)。
我还编写了另一个脚本以稍微不同的方式执行此操作,但结果相同:
for folder in "$@"
do
cd "$1"
find . -type f -maxdepth 1 -exec bash -c 'mkdir -p "${0%.*}"' {} \; \
-exec bash -c 'mv "$0" "${0%.*}"' {} \;
done
我觉得我缺少一些明显的东西。
【问题讨论】:
-
为什么你的循环不使用
$folder? -
我认为没有一种简单的方法可以使用 bash 参数扩展运算符来做你想做的事情。你可以用
sed来做。 -
您能否更具体地说明从文件名派生目录名时要遵循的规则? IE。模式是否总是
{ALPHA_NUMERIC_CHARACTERS}__{TWO_DIGITS}_{MORE_ALPHA_NUMERIC_CHARACTER}_{IGNORED_CHARACTERS}?或者模式会是别的什么?