3

В каталоге есть много папок .html внутри, я бы хотел, чтобы весь HTML анализировался как новый .txt с именем родительского каталога.

Example1/ Index.html> Example1.txt

Example2/ Index.html> Example2.txt

1 ответ1

2

Очевидно, вы хотите конвертировать некоторые HTML-страницы в обычный текст. Поэтому я не стал бы удалять теги с помощью специально созданного решения (например, с некоторой магией sed), но использовал бы инструмент, предназначенный для этой цели, такой как html2text ; со своей веб-страницы:

html2text - это скрипт Python, который преобразует страницу HTML в чистый, легко читаемый текст в формате ASCII. Еще лучше то, что ASCII также является допустимым Markdown (формат текста в HTML).

Чтобы ответить на ваш вопрос о пакетном переименовании:

find . -maxdepth 1 -type d -print0 | while IFS= read -r -d '' dirname
 do python path/to/html2text/html2text.py "${dirname}/index.html" > "${dirname}/${dirname}.txt"
done

Здесь команда find перечисляет все каталоги, расположенные только в текущем каталоге (т.е. не рекурсивно), а команда read (в условии while) присваивает значения переменной $dirname . Наконец, команда (ы) между do и done get (s), здесь он преобразует файлы в соответствии с вашим запросом. Как указывает @slhck, вам нужно использовать такую сложную команду, чтобы имена каталогов с пробелами ничего не ломали.

[Редактировать]: еще один вариант для преобразования всех файлов HTML в текущем каталоге:

find . -iname "*.html" -print0 | while IFS= read -r -d '' filename
  do python path/to/html2text/html2text.py "${filename}" > "${filename%.*}.txt"
done

iname ищет случай я nsensitive для *.html

${filename%.*}.txt удаляет расширение и добавляет .txt , т. е. если filename some/path/index.html , ${filename%.*} - это some/path/index и, наконец, ${filename%.*}.txt - это some/path/index.txt .


Когда вы используете оболочку Z, вы можете использовать намного более чистое средство для цикла, без торможения в пустых пространствах:

for i (*(/)) python path/to/html2text/html2text.py "${i}/index.html" > "${i}/${i}.txt"

Хитрость в том, что *(/) выполняет генерацию имени файла, но возвращает только каталоги (/) .

[Редактировать]: также в синтаксисе zsh вариант для преобразования всех файлов HTML в текущем каталоге (необходимо установить параметр EXTENDEDGLOB ):

for i ((#i)**/*.html) {
   python path/to/html2text/html2text.py "$i" > "${i:r}.txt"
}

(#i) использует случай я nsensitive подстановки, ** поиск рекурсивно, поэтому возвращается все HTML - файлы в текущей рабочей директории. (Если нужно следовать символическим ссылкам, используйте три звезды *** вместо двух).

Если у вас есть более одной команды внутри цикла for, используйте фигурные скобки { ... } (здесь нет необходимости, но они не повредят).

${i:r} удаляет расширение (r для удаления) из переменной $i .

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