
У меня более 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%, что понял вопрос, но вот несколько мыслей.
sed 's/:.*//'
исказит любое имя файла, в котором есть двоеточие. Является ли двоеточие допустимым символом имени файла на Mac? Если нет, то это не будет для вас проблемой. В противном случае рассмотрите возможность использованияsed 's/: Word.Document.8$//'
или.sed 's/: [^:]*$//'
.- Команда
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 } ⋮ '