2

У меня есть более 10000 файлов, которые не имеют расширений от старых версий 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.

2 ответа2

1

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

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

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

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

sed -e '/Word\.Document\.8/s/something/something else/;s/another/yet another/' \
    -e '/Excel\.Sheet\.8/s/something2/something else2/;s/another2/yet another2/' \
    ...

или же

awk '
      /Word\.Document\.8/ {
            awk commands for Word
      }
      /Excel\.Sheet\.8/ {
            awk commands for Excel
      }
          
'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .