Вопрос: объединить несколько текстовых файлов, _ + filenames_, в один текстовый файл


Я хотел бы объединить несколько текстовых файлов, но с названиями (EDIT: имена файлов). В идеале, что-то вроде

* a filename 
contents of file
... 
* another filename 
contents of file 
... 

etc... 

Я в Windows (не DOS), но имею доступ к powershell, pandoc, emacs, cygwin или чему-либо еще, что вы рекомендуете. (Ясно, что я новичок, пытающийся работать в режиме org.)

Я могу легко разместить их в одной папке. Но я хотел бы избежать ввода имени каждого файла. Если файл bat рекомендуется, я никогда не использовал его, но хочу учиться.


2
2017-11-29 05:29


Источник


Возможный дубликат это, - Rajib
@Rajib, я не понял, что этот вопрос хотел, чтобы заголовки перемежались вместе с комбинированным текстом. - Brady Trainor
А теперь я вижу, что вы имеете в виду имя файла. Извините, я неправильно понял «Название файла». - Rajib
ах, я отредактирую, чтобы придерживаться номенклатуры, но оставьте этот термин для поисковых запросов. - Brady Trainor


Ответы:


Я уверен, что есть что-то более умное, но вот сценарий powershell объединит все файлы:

$files = (dir *.txt)
$outfile = "out.txt"

$files | %{
    $_.FullName | Add-Content $outfile
    Get-Content $_.FullName | Add-Content $outfile
}

Это эффективно? Не страшно ... но он будет работать в крайнем случае.


5
2017-11-29 05:57



Это работает потрясающе. Я просто перешел к папке, щелкнул правой кнопкой мыши рамку, чтобы вставить ваш скрипт, и нажмите <RET>. Я могу найти замену для переключения C:\txt` to ** `. - Brady Trainor
Чтобы уточнить мой комментарий для потомков, я перешел из PowerShell. - Brady Trainor
@BradyTrainor, если вы хотите только имя файла, но не путь, переключите строку, которая $_.FullName | Add-Content $outfile читать $_.Name | Add-Content $outfile, - Mitch
Спасибо, Митч. Чтобы я мог продолжить обучение кода, как я могу добавить строку, такую ​​как " ** "? - Brady Trainor
Вы можете произвольно форматировать вещи, используя -f оператор. Видеть blogs.technet.com/b/heyscriptingguy/archive/2013/03/12/... для деталей. Чтобы сделать строку имени файла ** filename, вы должны указать ("** {0}" -f $_.Name) | Add-Content $outfile - Mitch


Вдохновленный структурой сценария Митча, я написал версию для сред, основанных на Unix, таких как GNU / Linux и OS X:

find -regex '.*\.\(docx?\|org\|rtf\|te?xt\)$' | while read file
do
    echo "* $file" >> target-file.org
    cat "$file" | pandoc -t org >> target-file.org
done

(Если вы не хотите устанавливать pandoc, просто удалите трубку и команду, | pandoc -t org.)

Этот скрипт найдет все файлы в текущем каталоге и его подкаталогах, у которых есть расширения файлов, как описано (.docx, и т.д).

Например, если список включает fileA.text а также fileB.rtf в подкаталоге subd/, targetfile.org будут получать такие строки, как:

* ./subd/fileA.text
<fileA's contents converted to an org file by pandoc>
* ./subd/fileB.rtf
<fileB's contents converted to an org file by pandoc>

Я думаю, что это уйдет target-file.org в довольно хорошем состоянии для улучшения изнутри Emacs, без слишком сложного сценария. (Особенно, если вы включили pandoc шаг.)


1
2017-08-07 00:01