模式匹配或其他方法从shell脚本中排除包?

odopli94  于 2023-03-19  发布在  Shell
关注(0)|答案(1)|浏览(81)

在macOS上,我一直使用存储为服务的Automator工作流程来运行以下bash脚本:

for dir; do
cd "$dir"
"$HOME"/fixFoldersDateMod "$dir"
done

这将在Finder中选择的文件夹上运行fixFoldersDateMod命令脚本,以修复文件夹结构的上次修改日期,递归地将所有文件夹设置为其中包含的所有文件/文件夹的最近修改日期。
但是最近,我在一个包含一些包的文件夹上运行了工作流,所有的包和其中的文件夹也都被修改了!现在我正在尝试找到一种方法来修改脚本,以根据它们的扩展名排除各种包及其内容。
下面是我尝试过的修改过的脚本(不能正常工作):

temp=(vst|vst3|app|component|aaxplugin|dpm)
pattern="(^|:)$temp(:|$)"
for dir; do
if [[ ! $dir =~ $pattern ]] ; then
  continue;
fi
cd "$dir"
"$HOME"/fixFoldersDateMod "$dir"
done

我不知道如何正确格式化shell脚本的正则表达式或模式匹配,但理想情况下,如果要正确工作,在Finder中选择一个文件夹并运行此工作流服务时,任何与包扩展名(vst|vst3|app|component|aaxplugin|dpm)列表匹配的包及其内容都将被排除在我的主文件夹中的fixFoldersDateMod脚本处理之外。
例如:

(selected folder/path - excluded?)
"/Library/Audio/Plug-Ins/VST/iZotope" - No
"/Library/Audio/Plug-Ins/VST/iZotope/Insight.vst" - Yes
"/Library/Audio/Plug-Ins/Components/Zynaptiq" - No
"/Library/Audio/Plug-Ins/Components/Zynaptiq/UNVEIL AU.component" - Yes

有人能告诉我我做错了什么吗,以及如何让它正常工作?
还有一个相关的注意事项,我如何让服务使用sudo(必要时提示输入密码)运行命令脚本,以便它也能在系统文件夹上工作?

chhqkbe1

chhqkbe11#

另一种稍微不同的方法可能适合您的要求,即利用bash case语句和参数扩展。使用处理find命令的输出并提取文件扩展名。如果扩展名是to-exclude列表的一部分,则跳过,否则,调整修改时间。类似于:

while read -r f ; do
    case "${f##*.}" in
        vst | vst3 | app | component | aaxplugin | dpm)
            ;; # skipping
        *)
            echo "adjust modified time for $f"
    esac
done < <(find "path/to/your/directory" -type f)

完整示例脚本:

#!/bin/bash

work=$(mktemp -d)

setup() {
    touch "$work/foo.bar"
    touch "$work/bar.baz"
    touch "$work/baz.foo"
    for ext in "vst" "vst3" "app" "component" "aaxplugin" "dpm"; do
        touch "$work/sample.$ext" 
    done
}

cleanup() {      
  rm -rf "$work"
  echo "Deleted temp working directory $work"
}

trap cleanup EXIT

setup

while read -r f ; do
    case "${f##*.}" in
        vst | vst3 | app | component | aaxplugin | dpm)
            ;; # skipping
        *)
            echo "adjust modified time for $f"
    esac
done < <(find "$work" -type f)

输出:

adjust modified time for /tmp/tmp.C3t3K1p4jS/foo.bar
adjust modified time for /tmp/tmp.C3t3K1p4jS/bar.baz
adjust modified time for /tmp/tmp.C3t3K1p4jS/baz.foo

相关问题