Мне заполнили каталог многими файлами без расширений, которые были помещены там вызовом к wget.
Я хочу использовать html2text для преобразования всех этих файлов в файлы простого текста.
Другими словами, как выполнить эту команду
html2text listbaba=A > listbaba=A.txt
но не только на listbaba=A
но все файлы в текущем каталоге без расширений. В Интернете каждый находит этот пример:
for file in *.html; do html2text "$file" > "$file.txt"; done
но вопрос тем, что должно я заменять "*.html"
сделать это для всех файлов без расширений ~
Можно использовать not
флаг в find
команда и выполнить итерации по тому выводу.
Находят файлы, которые не имеют расширения, или более конкретный, файлы, которые не имеют точки на их имя:
find . -type f -not -name "*.*"
Выполняют итерации по этим файлам и вызову html2text
:
for file in `find . -type f -not -name "*.*"`; do html2text "$file" > "$file.txt"; done
Можно инвертировать globbing шаблон:
for f in !(*.*); do html2text "$f" > "$f.txt"; done
Это, по-другому по сравнению с использованием find
в for f in "$(find [...])"; do [...]; done
(или путем выполнения find
в подоболочке с помощью обратных галочек), не повредится на именах файлов, содержащих новые строки (и, FWIW, старается не разветвлять подоболочку и выполнять другой процесс).
Чтобы это работало, Вам будет нужно extglob
опция bash
быть включенным в Вашем токе bash
экземпляр; однако extglob
должен идти по умолчанию:
user@debian:~/tmp$ shopt extglob
extglob on
Если extglob
выключено, можно включить его путем выполнения:
shopt -s extglob
и выключите его снова путем выполнения:
shopt -u extglob
Использование в качестве примера echo
:
user@debian:~/tmp$ tree
.
├── file1
├── file1.html
├── file2
├── file2.html
├── file3
└── file3.html
0 directories, 6 files
user@debian:~/tmp$ for f in !(*.*); do echo "$f"; done
file1
file2
file3