Запуск программы для каждого файла в каталоге - PullRequest
1 голос
/ 05 мая 2020

У меня есть программа, которая конвертирует файл docs в файл txt, и я хотел бы применить этот код к каждому файлу в каталоге.

Мой код ниже.

for f in ./folder/*; do
    unzip -p $f word/document.xml | sed -e 's/<\/w:p>/\n/g; s/<[^>]\{1,\}>//g; s/[^[:print:]\n]\{1,\}//g' >> ./txtfiles/$f.txt
done

I хотел бы перенаправить вывод программы в папку txtfiles.

Однако я продолжаю получать сообщение об ошибке

./docs2txt.sh: line 2: ./txtfiles/./folder/docfile.docx.txt: No such file or directory
./docs2txt.sh: line 2: ./txtfiles/$f.txt: ambiguous redirect

Так, например, в папке у меня будет

docfile1.docs
docfile2.docs

и я хочу применить сценарий и поместить вывод в папку txtfiles как

docfile1.txt
docfile2.txt

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

$f вернет путь, указанный вами в for

, например

for f in ./folder/*

, тогда $f значение будет ./folder/filename

for f in /tmp/folder/*

тогда $f значение равно /tmp/folder/filename

Вам необходимо указать выходной файл перенаправления в соответствии с этим. в вашем случае >> $f.txt должно работать

0 голосов
/ 05 мая 2020

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

for f in ./folder/*; do
    g=$(basename "$f"); echo $g
    g=${g##.doc}.txt; echo $g
    g=txtfiles/${g}; echo $g
    unzip -p "$f" word/document.xml | sed -e 's/<\/w:p>/\n/g; s/<[^>]\{1,\}>//g; s/[^[:print:]\n]\{1,\}//g' >> "$g"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...