Обнаружен файл в формате mac преобразуйте исходный файл в формат dos или unix

Обновлено: 04.07.2024

У меня есть жесткий диск NTFS, который я читал /записывал на своем iMac с использованием NTFS-3G /Tuxera. Причина, по которой он отформатирован в NTFS, в том, что он вышел из моего старого ПК. Его уникальной функцией является хранение тонны мультимедиа - в основном MP3-файлов, с редкими добавленными видео- и графическими файлами. Я только недавно начал покупать новые жесткие диски, но все еще не копировал файлы - в основном из-за этой проблемы. .

Однажды я начал замечать, что некоторые из моих MP3-файлов в iTunes не воспроизводятся, так как их невозможно найти. Когда я поднял Finder, чтобы посмотреть на диск, я заметил, что каталог, в котором они все хранились, был преобразован в «исполняемый файл Unix». Он имеет то же имя и дату модификации, что и каталог - несколько лет назад, когда в последний раз изменялся основной каталог, не считая большого количества последних изменений в файлах внутри него - - хотя его размер файла составляет менее 100 КБ. Мой диск все еще показывает то же количество использованной /доступной емкости.

Я просмотрел несколько мест в Интернете, но не смог придумать подобный сценарий. Просто чтобы повторить детали:

  • NTFS-диск для чтения /записи в NTFS-3G /Tuxera для Mac OS X
  • iMac использует 10.6.8 во время первой ошибки
  • Диск показывает, что его свободное /использованное пространство одинаково
  • Файл Phantom Unix имеет то же имя и дату изменения, что и каталог

Прежде чем начать Data Rescue, что является моим следующим шагом, мне было интересно, есть ли какие-либо другие шаги, которые я мог бы предпринять, или если мой диск не работает, и я мог бы просто переформатировать его . Есть предложения?

2 ответа

Поскольку NTFS является проприетарной файловой системой, разработанной Microsoft, вы никогда не можете быть уверены, что драйверы сторонних производителей работают должным образом. Конечно, NTFS-3G может работать большую часть времени, но все же они не могут предоставить такие надежные драйверы, как Microsoft, если только они выпустят их. Я знаю, это звучит глупо. Но когда я начал работать на Mac, я потерял около половины своей музыкальной библиотеки из-за плохой поддержки NTFS через сторонние драйверы. Поэтому, чтобы знать, что ваши данные в безопасности на Mac, настоятельно рекомендуется использовать HFS + или, по крайней мере, exFAT, если вам нужно передавать данные между Windows и OS X.

Что вы можете сделать сейчас:
Пока большая часть данных по-прежнему доступна на диске, попробуйте удалить его из раздела NTFS и переформатировать его в HFS +. Лучше всего использовать машину Windows, подключенную к iMac через Ethernet, для передачи данных с диска и сохранения их на на диске HFS +, подключенном к IMAC

Подключите диск к машине с Windows и посмотрите, работает ли папка. (Это может даже работать с виртуальной машины Windows, работающей в Virtualbox.) Если это так, скопируйте папку на новый диск или раздел, желательно HFS +.

Я полагаю, что это внешний HD-диск, и тогда не составит труда найти кого-то, у кого есть машина с Windows. Я думаю, что машина с Ubuntu тоже подойдет. Это, вероятно, только для чтения, но это не проблема, если ваша единственная цель - скопировать данные с этого диска на другой. (Virtualbox + Ubuntu можно загрузить бесплатно, но я не знаю, решит ли это вашу проблему.)

Если у вас нет доступа к компьютеру под управлением Windows или Ubuntu, не трогайте диск или создавайте образ диска и используйте этот образ для тестирования, пока все данные не будут в безопасности.

Femidion писал(а): Ты вот пришёл в мою ветку, выкабениваешься здесь, пишешь охинею, пытаешься всё высмеять. пользы от тебя никакой, только понты и хамство. зачем? Может ты тот самый лживый чурка-паразит?
Статьи или фрагменты кода для новичков и уже опытных скриптеров по Metamod.

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по Metamod.

  1. В этой статье я не буду учить кого-либо С++, как во многих статьях о написании плагинов на pawn. Я лишь расскажу принцип работы плагинов, использование metaAPI и функций.
  2. Если вы думаете, что метамод откроет Вам доступ напрямую ко всему движку - очень ошибаетесь. Единственным существенным(!) отличием amxx-плагинов от meta-плагинов - использование С++ вместо pawn.
Metamod is a plugin/DLL manager that sits between the Half-Life Engine and an HL Game mod, allowing the dynamic loading/unloading of mod-like DLL plugins to add functionality to the HL server or game mod.

Но Вы можете подключать плагин напрямую к движку, т.е. так же, как подключается metamod .

Основной принцип работы метамода таков :

  1. Загрузка плагинов начинается как только движок вызовет функцию GiveFnptrsToDll (расшифровать можно как получение_указателей_функций )
  2. Из конфига метамода выбираются все необходимые плагины(незакомментированнные и соответствующие платформе).
  3. Каждый плагин обрабатывается (открывается dll, выполняется поиск необходимых функций) и вызывается ряд функций:
    Meta_Init(если существует)
    GiveFnptrsToDll
    Meta_Query
    Meta_Attach
  4. Если существуют какие-либо другие функции получения таблиц функций, то и они вызываются:
    GetEntityAPI
    GetEntityAPI_Post
    GetEntityAPI2
    GetEntityAPI2_Post

  • для каждого плагина, который "захватывает" вызов данной функции, вызывается соответствующая функция внутри плагина
  • вызывается оригинальная функция из движка\длл мода
  • для каждого плагина проверяется наличие "post" функции, которая, если существует, вызывается после оригинальной
  • запретить вызов оригинальной функции( SUPERCEDE )
  • заменить возвращаемое значение оригинальной функции( OVERRIDE )
  • я тут приложил свою руку( HANDLED )
  • я тут ничего такого не сделал( IGNORED )

После вызова всех функций из плагинов, текущее значение META_RESULT задается наивысшим по приоритету среди значений, которые вернули плагины. После чего проверяется необходимость вызова оригинальной функции. В зависимости от результата, вызывается или пропускается(плагин вернул META_SUPERCEDE ) оригинальная функция из игровой DLL. Все "post" функции вызываются точно так же(если META_SUPERCEDE не является текущим значение META_RESULT).

Если какой-либо из плагинов установил значение META_OVERRIDE или META_SUPERCEDE , то значение, которое вернул последний плагин будет возвращено движку оригинальной функцией(для не-void функций). Поэтому расположение плагинов в metamod.ini может влиять на конечный результат.

Макросы, используемые для работы с возвращаемым значением :

  • SET_META_RESULT(результат)
    Устанавливает META_RESULT для данного плагина.
  • RETURN_META(результат)
    Устанавливает META_RESULT для данного плагина и возвращает результат. Используется в "void" функциях.
  • RETURN_META_VALUE(результат, значение)
    Устанавливает META_RESULT для данного плагина и возвращает указанное значение. Используется в не-"void" функциях, тип возвращаемого значения ни на что не влияет.
  • META_RESULT_STATUS
    Получает текущее значение META_RESULT для данной функции из плагинов. Вернет наивысший по приоритету результат(по возрастающей: IGNORED, HANDLED, OVERRIDE, SUPERCEDE ).
  • META_RESULT_PREVIOUS
    Получает значение META_RESULT от предыдущего плагина.
  • META_RESULT_ORIG_RET(тип)
    Получает оригинальное возвращаемое значение оригинальной функции, например возвращаемое значение функции из игровой DLL. Тип возвращаемого значения оригинальной функции должен быть указан в макросе; используется для приведения типов в выражении. Это справедливо только для "post" функций.
  • META_RESULT_OVERRIDE_RET(тип)
    Получает возвращаемое значение из плагина, который вернул META_OVERRIDE или META_SUPERCEDE . Тип возвращаемого значения оригинальной функции должен быть указан в макросе; используется для приведения типов в выражении. Должен использоваться только после проверки META_RESULT если существует доступное значение для замены возвращаемого значения оригинальной функции.
  • MDLL_*(аргументы)
    Вызывает указанную DLLAPI функцию в игровой DLL. Например, MDLL_GameDLLInit(аргументы), MDLL_Spawn(аргументы), и т.д.
  • MNEW_*(аргументы)
    Вызывает указанную NEWAPI функцию в игровой DLL. Например, MNEW_GameShutdown(аргументы), и т.д.

III. HelloWorld
Я знаю, что вам уже не терпится. Вот минимум кода, который потребуется для компиляции плагина под Windows. Linux все-таки требуется отдельной статьи.

void WINAPI GiveFnptrsToDll ( enginefuncs_t * pengfuncsFromEngine , globalvars_t * pGlobals )
memcpy (& g_engfuncs , pengfuncsFromEngine , sizeof ( enginefuncs_t ));
>

  • METASDK 1.19(папка metamod в исходниках метамода)
  • HLSDK 2.3 p3
  • %hlsdk% /common
  • %hlsdk% /dlls
  • %hlsdk% /engine
  • %hlsdk% /pm_shared
  • %metasrc% /metamod

В следующей главе будет рассмотрена тема использования таблиц функций, практическое применение информации из этой статьи. Просьба тут оставлять комментарии и вопросы ТОЛЬКО к статье, а все вопросы по кодингу в соответствующем разделе.

tags/тэги : metamod, кодинг, плагины, как начать, создание, написание

Последний раз редактировалось 6a6kin 12 апр 2019, 10:34, всего редактировалось 3 раз(а). Единственным существенным(!) отличием amxx-плагинов от meta-плагинов - использование С++ вместо pawn.

Не помогаю в ЛС - есть форум.
Плагины тоже не пишу, на форуме достаточно хороших скриптеров.

"я ставлю зависимости потому что мне приятно" - subb98 @ 2017

Не пишите мне в ЛС : если вам нужна помощь на бесплатной основе. Любые вопросы на форум. Да, начал готовить почти сразу, но отложил, т.к. был занят. Надеюсь, что за эти выходные сделаю.

Сделал все по инструкции, ответ

Тут пример проекта по студию.

Были бы в языке pawn объекты, было бы круто. Почему нет объектов в павне?

Кто сейчас на конференции

Как я могу программно (то есть, не используя vi ) преобразовать DOS/Windows newlines в Unix?

Команды dos2unix и unix2dos недоступны в некоторых системах. Как я могу эмулировать их с помощью таких команд, как sed / awk / tr ?

Согласен! @BradKoch просто как "brew install dos2unix" на Mac OSX

Ответы - Как преобразовать DOS или Windows перевод строки (возврата каретки и перевода строки) в Unix перевод строки (LF) в bash-скрипт? / How to convert DOS/Windows newline (CRLF) to Unix newline (LF) in a Bash script?

codaddict

Используя AWK вы можете сделать:

Используя Perl вы можете сделать:

Jonathan Leffler

Вы можете использовать tr для преобразования из DOS в Unix; однако вы можете сделать это безопасно только в том случае, если CR появляется в вашем файле только как первый байт пары байтов CRLF. Так обычно и бывает. Затем вы используете:

Обратите внимание, что имя DOS-file отличается от имени UNIX-file ; если вы попытаетесь использовать одно и то же имя дважды, вы не получите никаких данных в файле.

Вы не можете сделать это наоборот (со стандартным 'tr').

Если вы знаете, как ввести возврат каретки в скрипт ( control-V , control-M для ввода control-M), то:

где '^M ' - это символ control-M. Вы также можете использовать механизм bash ANSI-C Quoting для указания возврата каретки:

Однако, если вам придется делать это очень часто (грубо говоря, несколько раз), гораздо разумнее установить программы преобразования (например dos2unix и unix2dos , или, возможно dtou и utod ) и использовать их.

@ButtleButkus: Ну да, именно поэтому я использовал два разных имени. Если вы закроете входной файл до того, как программа прочитает его все, как вы делаете, когда вы используете одно и то же имя дважды, вы получите пустой файл. Это единообразное поведение в Unix-подобных системах. Для безопасной перезаписи входного файла требуется специальный код. Следуйте инструкциям, и все будет в порядке. Я, кажется, помню, что функция поиска в файле-замена где-то была. Есть места, и вы должны знать, где их найти. В рамках ограничений sed (для in-place); ограничения представляют собой связанные файлы и символические ссылки. Команда -i "всегда" (с 1979 года, если не раньше) поддерживает опцию sort , которая может выводить список одного из входных файлов. Однако отчасти это связано с тем, что -o должен прочитать все свои входные данные, прежде чем он сможет записать любой из своих выходных данных. Другие программы периодически поддерживают перезапись одного из своих входных файлов. Вы можете найти программу общего назначения (скрипт), чтобы избежать проблем в "среде программирования UNIX" Kernighan & Pike. @JonathanLeffler к вашему сведению, для пользователей macOS: sed не делает (по умолчанию, не уверен, что вы можете это изменить?) признать сбежал версий \r , \015 , \x0d для возврата каретки; sed признает КЛ при вводе с ctrl-v ctrl-m , как описано выше ( @AaronFranke: это зависит от того, как выглядит ваш сценарий. В моей книге, Если вам нужно изменять кучу файлов таким же образом, вы используете скрипт для инкапсуляции обработки (даже если вы его выбросить после того, как вы закончили), а затем использовать такой инструмент, как find , чтобы определить файлы, которые нужно изменить (или создать список имен файлов — один надеется, что они не должны содержать пробелов и прочих непокорных препинания в названиях), а затем применить скрипт в архиве. Используя find … -exec sh script.sh <> + является довольно эффективным. Альтернатив-легион. Техника find работает с абсурдными именами.

ghostdog74

посмотрите здесь примеры использования sed :

Используйте sed -i для преобразования на месте, например sed -i 's/. /' file .

Я использовал вариант, так как мой файл только \r : tr "\r" "\n" < infile > outfile @MattTodd не могли бы вы опубликовать это в качестве ответа? -d используется чаще и не поможет в ситуации "только \r ". Обратите внимание, что предложенное \r \n имеет эффект двойного интервала между файлами; каждая отдельная строка CRLF, заканчивающаяся в DOS, становится \n\n в Unix.

Gordon Davisson

Решения, опубликованные до сих пор, касаются только части проблемы , преобразования CRLF DOS/Windows в LF Unix; часть, которую они упускают, состоит в том, что DOS использует CRLF в качестве разделителя строк , в то время как Unix использует LF в качестве Терминатора строк . Разница в том, что файл DOS (обычно) не будет иметь ничего после последней строки в файле, в то время как Unix будет. Чтобы правильно провести конвертацию, вам необходимо добавить этот final LF (если только файл не имеет нулевой длины, т. е. в нем вообще нет строк). Мое любимое заклинание для этого (с небольшой добавленной логикой для обработки файлов, разделенных CR в стиле Mac, а не файлов, которые уже находятся в формате unix) - это немного perl:

Обратите внимание, что это отправляет Unixified версию файла в stdout. Если вы хотите заменить файл на Unixified версию, добавьте флаг perl -i .

Было бы намного проще, если бы мы жили в мире, в котором существует один лишь Linux, и если бы приложениям не требовались данные из других источников. Однако все еще существует необходимость в получении данных из систем Windows, MS DOS и Macintosh. Импортирование таких документов требует соответствующего перекодирования; иначе было бы невозможно обмениваться данными, или содержимое файлов интерпретировалось бы некорректно. Вообще самый простой способ передавать данные между системами - это с помощью обычных текстовых файлов или в таких форматах как CSV-файлы (значения, разделенные пробелами). Однако преобразование файлов из форматов Windows и Mac OS приводит к различиям в символах новой строки и кодировке символов . В этой статье рассказано, отчего возникают такие проблемы и как их устранить.

Проблема новой строки

Откуда пошли названия символов CR и LF

  • Linux и Mac OS X унаследовали Unix-стиль и используют LF (управляющий ASCII -символ line feed) в качестве символа конца строки.
  • Старые Macintosh-системы использовали CR (carriage return, другой управляющий ASCII-символ).
  • В Windows используется два символа - CR и затем LF.

Чтобы узнать, какой символ используется в текстовом файле для новой строки, запустите hexdump . С его помощью можно исследовать содержимое файла побайтово. Я подготовил два трехстроковых файла - один на Linux-системе, другой на Windows - и вывел их содержимое побайтово. Файл выводится порциями по 16 байт, отображаются собственно символы и их представления в восьмеричной системе счисления. Обратите внимание, что Linux-файл содержит управляющий символ \n, а Windows - \r и затем \n. На старых Macintosh-системах вы бы увидели одиночный символ \r.

Для преобразования файлов из Windows в Linux можно воспользоваться командой с говорящим названием dos2unix . Самый простой способ преобразовать файл test.windows в формат Linux - запустить

Однако можно воспользоваться и потоковым вариантом:

Все ключи команды можно узнать, посмотрев справку dos2unix -h или man dos2unix .

Для преобразования текстового файла со старой Macintosh-системы необходимо заменить символы CR на LF, это можно сделать с помощью программы tr (translate): который просто меняет каждый символ CR (восьмеричное 015) на LF (восьмеричное 012). tr также может произвести удаление символа CR для преобразования из Windows-системы, нужно воспользоваться ключом -d. Действие, аналогичное действию ранее упомянутой dos2unix, достигается следующим образом:

Проблема кодировки

Unicode не нужен для обычного английского текста: вполне хватит ASCII-символов, включающих обычные неакцентированные буквы от A до Z, цифры от 0 до 9 и знаки пунктуации. Если вы работаете только с латинским алфавитом, использующимся в странах Западной Европы, то можете сохранять текст в кодировке ISO 8859-1 (неформально ее называют Latin-1), в которой каждый символ занимает один байт, однако в ней невозможно представить символы других языков. Однако в других языках требуется более широкий набор символов и без Unicode не обойтись. Unicode поддерживает более 100 тысяч символов из нескольких десятков языков. Unicode (также известый как стандарт ISO 10646) является расширением ASCII. В то время как ASCII отводит под каждый символ ровно 1 байт, для Unicode-символа требуется больше. Для обеспечения совместимости между ASCII и Unicode обычно используют кодировку UTF-8 . В ней для ASCII-символов используется как обычно 1 байт (поэтому ASCII-файл также считается корректным файлом в кодировке UTF-8), а для символов других языков и служебных символов - больше.

Хотя UTF-8 и Latin-1 одинаково кодируют ASCII-символы, однако акцентированные и т.п. символы представляются иначе; поэтому чтобы корректно обработать файл, необходимо знать его формат, иначе все символы, не принадлежащие ASCII-таблице, будут искажены.

Требуемая кодировка зависит от используемого приложения. Большинство Linux-программ работают с кодировкой UTF-8, многие другие используют Latin-1, а некоторые обе кодировки сразу. Сначала нужно определить, текст в какой кодировке нужен программе, а затем преобразовывать, если это требуется. К счастью, это можно с легкостью сделать (причем в обоих направлениях), воспользовавшись программой recode .

recode предлагает множество опций (для более подробной справки наберите recode --help или info recode ), ей можно воспользоваться для преобразования текста в разнообразные кодировки (для получения полного списка поддерживаемых кодировок введите recode -l ). Однако для простых преобразований достаточно команд: (на выходе получится текст в кодировке Latin-1 и UTF-8 соответственно)

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

Заключение

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

Читайте также: