对选定文件夹执行一系列命令的服务,以消除 Finder 中 .DS_Store 文件的问题

对选定文件夹执行一系列命令的服务,以消除 Finder 中 .DS_Store 文件的问题

我正在尝试使用可以分配给键盘快捷键的服务对 Finder 中选定的目录及其所有子目录(递归)执行复杂的操作。

首先,我发现,当简单地通过终端发出大多数命令时,我就能实现预期的结果。当尝试调用第二个函数/脚本来处理子例程时,问题就出现了。

以下是我目前所拥有的,从/bin/bashAutomator 服务使用的 shell 脚本()开始(它接收as arguments来自files or foldersFinder.app 中选择的输入):

for dir; do
    echo "$dir"
    "$HOME"/fixDsStoreFiles "$dir"
done

这将调用fixDsStoreFiles位于我的主文件夹中的脚本来处理所选文件夹。以下是它的第一部分。

#!/bin/bash
# first, clear script log file on desktop
echo '' >|~/Desktop/testScript.txt
# Check that exactly one parameter has been specified - the directory
if [ $# -eq 1 ]; then
   # Go to that directory or give up and die
   cd "$1" || exit 1
   #  use touch to create a .DS_Store file in the current directory, and/or set date modified of the existing file to Jan 1, 2001 01:01AM
   touch -t 200101010101 .DS_Store
   # copy .DS_Store file to all subdirectories recursively
   find . -type d -mindepth 1 -exec cp -n ".DS_Store" {} \;

这就是问题所在。如果我通过终端执行以下命令,并将 Finder 中选定的目录作为当前目录,则下标将按预期工作。

find . -type d -mindepth 1 -exec $HOME/testScript {} \;

但是,当尝试从脚本执行它时,或者在脚本中将代码作为函数fixDsStoreFiles添加时(在顶部),它无法执行必要的步骤。testScriptfixDsStoreFiles

这是的代码testScript

# find & trash all empty folders (the ones containing nothing but a .DS_Store file)
#!/bin/bash
cd "$1"
dir=.
absDir=$(cd -- "$dir" && pwd)
eval=$(find . \! -name ".DS_Store");
OUT=();
for I in $eval
do
OUT=${OUT:+$OUT}$I
done
if [ $OUT == . ]; then
echo "\"$absDir\" - EMPTY DIRECTORY TRASHED!" >>~/Desktop/testScriptLog.txt && trash -F "$absDir"
else echo "\"$absDir\" is NOT empty" >>~/Desktop/testScriptLog.txt
fi

基本上,我会连接并解析命令的输出find,以查看给定的子目录是否包含除 .DS_Store 文件之外的任何内容。如果它为空,则输出将只是.。如果它包含其他文件/文件夹,则连接的字符串将在一个字符串中列出文件夹中的所有文件/文件夹。

这是完成删除 [几乎] 空的文件夹的功能fixDsStoreFiles后运行的脚本的剩余部分。testScript

   # find all .DS_Store files, set date modified to Jan 1, 2001 01:01AM, and make them read only
   find . -name '.DS_Store' -exec zsh -c 'touch -t 200101010101 "$1" && chmod 444 "$1" || echo "$1" >> ~/Desktop/fixDsStoreFiles_errors.txt' zsh {} \;
   # run syncFF in current directory
   open -a "SyncFF" "$1"
fi

对于没有它的人来说,SyncFF 是一个很好的实用程序,它有一个 GUI,可以递归扫描目录结构,将每个文件夹的修改日期设置为其中最近更新的文件。

然而不幸的是,如果文件夹中除了 .DS_Store 文件之外是空的,它会保留当前的日期/时间,因为没有 SyncFF 将扫描并用于设置文件夹日期的文件。

这就是为什么我要使用testScript: 删除这些文件夹,以便最终整个目录结构中只有其中的任何文件夹会根据其中实际项目文件/文件夹的日期进行更新确实被修改了-不是仅通过查看文件夹时更新令人厌烦的 .DS_Store 文件,从而搞砸了修订控制、按修改日期对工作目录进行排序等。

我已经筹备了很长时间,这是迄今为止我想到的解决这个问题的最佳/最实用/维护成本最低的办法。通过确保每个文件夹都有一个 .DS_Store 文件,所有文件夹的修改日期都是很多早于任何其他文件,并且它们都设置为read only,这应该可以防止由于浏览或更改层次结构的视图设置而导致文件夹修改日期的任何未来更新,并且只有任何项目文件夹中的工作文件修改才会实际更新其修改日期。

当然,这意味着牺牲 .DS_Store 文件帮助 macOS/Finder 实现的一些功能。但为了能够按照上次操作的日期来整理内容,这只是一个小小的代价。

希望这些信息足够(但不要太多),以便有人可以帮助我找出我在这里做错的地方,以便我可以按照需要通过一次击键完成整个工作。

我真诚地感谢任何人能投入时间和精力来帮助我!

相关内容