Служба для выполнения серии команд для выбранных папок для устранения проблем с файлами .DS_Store в Finder.

Я пытаюсь выполнить сложную операцию над выбранным каталогом и всеми подкаталогами (рекурсивно) в Finder, используя службу, которую я могу назначить сочетанию клавиш.

Во-первых, просто вводя большинство команд через терминал, я обнаружил, что могу добиться желаемого результата. Проблема возникает при попытке вызвать вторую функцию/скрипт для обработки подпрограммы.

Вот что у меня есть на данный момент, начиная со сценария оболочки (), используемый службой Automator (которая получает входные данныеиз выбранныхв Finder.app):

      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

По сути, я объединяю и анализирую выводкоманда, чтобы узнать, содержит ли данный подкаталог что-либо, кроме файла .DS_Store. Если в противном случае он пуст, вывод будет просто. Если он содержит другие файлы/папки, объединенная строка будет перечислять все файлы/папки в папке в одной строке.

Вот остатокскрипт, который будет запускаться после завершения своей функции по удалению [почти] пустых папок.

         # 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, что дата модификации для всех из них намного раньше, чем для любого из других файлов, и что для всех них установлено значение, это должно предотвратить любое будущее обновление дат изменения папок из-за просмотра или изменения настроек представления иерархии, и только изменения рабочих файлов в любой из папок проекта будут фактически обновлять их дату изменения.

Конечно, это означает пожертвование некоторыми функциями, которые файлы .DS_Store помогают реализовать в macOS/Finder. Но это небольшая цена за возможность сохранять порядок к дате, когда вы в последний раз над ними работали.

Надеюсь, этой информации будет достаточно (но не слишком много), чтобы кто-нибудь помог мне понять, что я здесь делаю не так, и чтобы я мог заставить все это работать одним нажатием клавиши, как мне хочется.

Я искренне ценю любое время и усилия, которые каждый может посвятить, чтобы помочь мне в этом!

0 ответов

Другие вопросы по тегам