Как добавить расширения к множеству файлов, используя содержимое каждого файла?

Как добавить расширения к множеству файлов, используя содержимое каждого файла?

У меня более 10 000 файлов, не имеющих расширений из старых версий Mac OS. Они чрезвычайно вложены в файловую структуру, а также имеют всевозможные странные форматы и символы. У них больше нет типов файлов или кодов создателей, прикрепленных к ним. Во многих из этих файлов есть текст, который позволит мне определить расширения (например, Word.Document.8 есть в тексте каждого файла, созданного этой версией Word).

Я нашел скрипт, который, похоже, будет работать с одним из этих типов файлов одновременно, но он стирает части имен файлов после вредоносных символов, что не есть хорошо.

find . -type f -not -name "*.*" -print0 |\
    xargs -0 file |\
    grep  'Word.Document.8' |\
    sed 's/:.*//' |\
    xargs -I % echo mv % %.doc

Мне сначала очистить символы в именах файлов или программно обработать их в скрипте, чтобы оставить их такими же? Пока я не теряю информацию из имен файлов, я не вижу проблемы в очистке слешей и других проблемных символов. Кроме того, если я очистлю имена файлов, скорее всего, будут дубликаты, поэтому любой скрипт очистки должен будет добавить что-то вроде "-1" перед расширением, чтобы убедиться, что ничего не потеряется.

Я не привязан к этому скрипту, но он понятен, что является плюсом. На этом файловом сервере установлена ​​Mac OS X 10.6, но у меня есть доступ ко всем последним версиям OS X.

решение1

Я все еще не уверен на 100%, что понял вопрос, но вот несколько мыслей.

  1. sed 's/:.*//'исказит любое имя файла, в котором есть двоеточие. Является ли двоеточие допустимым символом имени файла на Mac? Если нет, то это не будет для вас проблемой. В противном случае рассмотрите возможность использования sed 's/: Word.Document.8$//'или. sed 's/: [^:]*$//'.
  2. Команда mv, порожденная , xargsвыглядит как проблема. Попробуйте
    xargs -I % sh -c 'echo mv "%" "%.doc"'.

решение2

Второй вопрос: как изменить скрипт, чтобы он одновременно искал несколько типов файлов и присваивал каждому из них правильное расширение?

Вот несколько советов, с которых можно начать:

sed -e '/Word\.Document\.8/s/что-нибудь/что-то другое/;с/другой/еще один/' \
    -e '/Excel\.Лист\.8/s/что-то 2/что-то еще 2/;с/еще 2/еще 2/' \
    ...

или

awk'
      /Word\.Документ\.8/ {
            команды awk для Word
      }
      /Excel\.Лист\.8/ {
            команды awk для Excel
      }
          
'

Связанный контент