Команда терминала для удаления пользовательского значка из файла (HFS+)

Контекст

В Mac OS X / macOS вы можете выбрать файл в Finder, нажать «Информация», затем щелкнуть значок и вставить любое изображение/значок из буфера обмена. Теперь этот файл имеет собственный значок, сделанный из этого изображения.

Чтобы удалить его, обычный способ — выбрать файл, нажать «Информация», выбрать пользовательский значок, затем нажать, deleteи пользовательский значок удаляется, восстанавливая значок по умолчанию.

Вопрос

Есть ли способ удалить эти пользовательские значки из этих файлов, не открывая окно Finder? Например, с помощью команды терминала?

Почему

Файл имеет поврежденный пользовательский значок, открытие Finder в этой папке приводит к тому, что Finder сбивается с толку, а жесткий диск сходит с ума. Но я по-прежнему могу получить доступ к содержимому папки и этому файлу из командной строки, если сначала не открою окно Finder. Поэтому я думаю, что мне «просто» нужно по-другому обращаться к метаданным, чтобы удалить пользовательский значок.

Ответы (2)

Для файлов с пользовательским значком macOS записывает данные значка в файл в виде ответвления ресурса . Используйте команду в следующей форме:xattr

xattr -d com.apple.ResourceFork /path/to/filename

Для получения дополнительной информации о xattr команде введите в Терминале следующую команду и нажмите:enter

man xattr

Или просто введите xattr, а затем щелкните правой кнопкой мыши и выберите: Открыть справочную страницу


Для папок с пользовательским значком в Терминале измените каталог на папку , содержащую пользовательский значок , например:

cd /path/to/foo

Оказавшись в каталоге , используйте следующую команду , чтобы удалить пользовательский значок :

rm Icon?

Обратите внимание, что вы также можете просто использовать:

rm /path/to/foo/Icon?

Однако вы не можете использовать кавычки , одинарные или двойные, если имя пути содержит пробелы и должно отделяться от пробелов обратной косой чертой , \например:

rm /path/to/foo\ bar/Icon?

Цитирование имени пути просто вернет следующую ошибку:

: No such file or directory

По умолчанию Icon?это скрытый файл, а ?in Icon?на самом деле является \nсимволом перевода строки.

Разве нельзя хранить другие вещи в вилке ресурсов? Если да, то не xattr -d com.apple.ResourceFork myfileудалить ли все такие активы, в том числе те, которые не являются значком?
@Tom, в современных версиях macOS он используется только таким образом и может быть безопасно удален для того, что нужно сделать OP. Существуют и другие расширенные атрибуты , которые можно не удалять, но они имеют другое имя, например com.apple.FinderInfo, com.apple.metadata:kMDItemDownloadedDate:, com.apple.metadata:kMDItemWhereFroms, и т. д.
Вы можете указать путь с пробелами. Вам просто нужно удалить обратную косую черту. Это либо цитирование, либо экранирование обратной косой чертой, а не то и другое. "/some path/with spaces/"или /some\ path/with\ spaces/.

Альтернативой является использование SetFileдля отключения бита «пользовательского значка» файла:

SetFile -a c /path/to/file

Одно различие между этим и xattr -d com.apple.ResourceForkсостоит в том, что xattr -dданные изображения уничтожаются в ответвлении ресурсов файла, а SetFileданные остаются на месте. Если вы оставите данные на месте, вы можете восстановить пользовательский значок позже, например:

SetFile -a C /path/to/file # note the lettercase

Если вы хотите, вы можете извлечь пользовательский значок в отдельный файл, прежде чем полностью удалить его из файла:

DeRez -only icns /path/to/file > extracted.rsrc

(Обратите внимание, что это копирует данные. Вам все равно нужно будет удалить встроенный значок, используя xattr.)

Я также должен отметить, что xattr -dбит «пользовательский значок» остается установленным, что означает, что если вы когда-либо вставите новые данные icns в вилку ресурсов файла, они сразу же отобразятся. Итак, я думаю, если вы действительно хотите сделать файл как можно более ванильным, вам следует сделать и то, и другое: удалить вилку и сбросить пользовательский бит. (Но я действительно не знаю, имеет ли это значение.)

(Кстати, вы можете вставить пользовательские данные значка, например:)

Rez -append icon.rsrc -o /path/to/file
Прохладный. Есть ли способ оставить значок на месте, если, например, сценарий bash редактируется, а затем сохраняется в текстовом редакторе? Является ли лучшим решением сначала извлечь значок, затем отредактировать файл, а затем снова вставить значок после сохранения?
@nisc Я думаю, что редактирование файла с помощью другого приложения обычно не удаляет пользовательский значок. Я делаю это с файлами рабочей области моей IDE (это просто файлы JSON), и похоже, что обновление настроек моей рабочей области (которое повторно сохраняет файл рабочей области) не удаляет пользовательский значок. Если ваша операция сохранения перезаписывает файл с нуля (что делают некоторые приложения), вам может потребоваться многоэтапный процесс, как вы описываете.
К. Я видел это и с vimи сAtom