Служба для выполнения серии команд для выбранных папок для устранения проблем с файлами .DS_Store в Finder.
Я пытаюсь выполнить сложную операцию над выбранным каталогом и всеми подкаталогами (рекурсивно) в Finder, используя службу, которую я могу назначить сочетанию клавиш.
Во-первых, просто вводя большинство команд через терминал, я обнаружил, что могу добиться желаемого результата. Проблема возникает при попытке вызвать вторую функцию/скрипт для обработки подпрограммы.
Вот что у меня есть на данный момент, начиная со сценария оболочки (
for dir; do
echo "$dir"
"$HOME"/fixDsStoreFiles "$dir"
done
Это вызывает сценарий, который находится в моей домашней папке, и приступает к работе с выбранной папкой. Вот первая часть.
#!/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 {} \;
Но при попытке выполнить его из скрипта или при добавлении кода как функции внутри скрипта (вверху) не удается выполнить необходимый шаг.
Вот код для .
# 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 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 — это хорошая утилита с графическим интерфейсом, которая сканирует структуру каталогов, рекурсивно устанавливая дату изменения для каждой папки в соответствии с последним обновленным файлом в ней.
Однако, к сожалению, если папка пуста, за исключением файла .DS_Store, она сохраняет текущий день/время, поскольку нет файлов, которые SyncFF будет сканировать и использовать для установки даты папки.
Вот почему я удаляю эти папки с помощью
Работа над этой проблемой длилась долгое время, и на данный момент это лучшая/наиболее функциональная/минимальная в обслуживании идея, которую я придумал для решения этой проблемы. Убедившись, что в каждой папке есть файл .DS_Store, что дата модификации для всех из них намного раньше, чем для любого из других файлов, и что для всех них установлено значение
Конечно, это означает пожертвование некоторыми функциями, которые файлы .DS_Store помогают реализовать в macOS/Finder. Но это небольшая цена за возможность сохранять порядок к дате, когда вы в последний раз над ними работали.
Надеюсь, этой информации будет достаточно (но не слишком много), чтобы кто-нибудь помог мне понять, что я здесь делаю не так, и чтобы я мог заставить все это работать одним нажатием клавиши, как мне хочется.
Я искренне ценю любое время и усилия, которые каждый может посвятить, чтобы помочь мне в этом!