我在许多不同的文件夹中存储了许多不同的文件。
我的最终目标是将所有最终的 PDF 文件自动复制或存储到另一个文件夹中,这样我就可以拥有一个包含来自各个文件夹的所有 PDF 文件的文件夹。
到目前为止我有一个像这样的目录
C:Exams
\Subject 1
Exam A.pdf
Exam B.pdf
\Subject 2
Exam C.pdf
Exam D.pdf
\Subject 3
Exam E.pdf
Exam F.pdf
...
现在,我想要一个新文件夹,其中包含所有这些 PDF 文件。这可能吗?
我还有其他文件夹,例如笔记等。因此,Texmaker 或其他程序盲目地将 Texmaker 的所有 PDF 输出放在一个文件夹中是不可取的。
最终目标是开发一个替代脚本或程序,检查考试文件夹中的 PDF 文件并将其复制到所选文件夹。可惜的是,我没有自定义 Texmaker 的经验,也没有使用任何编程语言的经验。
答案1
我使用 Windows 的内置工具编写了一个小脚本,因此您无需安装任何东西。它基本上是递归source
扫描目录中的pdf
文件,然后将它们复制到destination
文件夹中。
我使用 TeXStudio,这是 Texmaker 的另一个版本。但是,我认为您可以以相同的方式在 IDE 中运行脚本。在该quickbuild
部分中应该有一个用户命令选项,您可以在那里编写自己的编译,例如pdflatex
:
pdflatex -shell-escape -synctex=1 -interaction=nonstopmode %.tex | tmx://internal-pdf-viewer | "C:\LaTeX Projects\move-pdf.bat" . pdfs
在这种情况下,您需要脚本的绝对路径,并且还需要输入目录。
要手动执行脚本,您需要在命令行中调用它:(move-pdf.bat source destination
假设您将脚本命名为move-pdf.bat
)。例如,如果您想在当前目录中运行它,只需执行:move-pdf.bat . pdfs
。如果您想在多个目录中运行它,最好将它放在系统可以找到的地方,或者将放置脚本的路径添加到系统变量中。否则,您可以将它放在每个目录中。此外,如果您想避免一直传递参数而只针对默认源和目标执行,请将这些路径放在两个变量src
和中dst
。
@ECHO off
IF [%1]==[] GOTO usage
IF [%2]==[] GOTO usage
SET src=%~f1
SET dst=%~f2
IF EXIST "%dst%" GOTO process
MKDIR "%dst%"
:process
ECHO Copying from "%src%" to "%dst%"
:: Exclude file. Exclude the same directory in the case that destination is a subdir of source.
SET exf=%TEMP%\%~n0-exclude.txt
echo %dst% > %exf%
:: Move to source
SET cur=cd
cd "%src%"
:: Copy files recursively (/S), and only newer than destination (/D), automatically (/Y).
FOR /R %%G IN (*.pdf) DO XCOPY /S /D /Y /EXCLUDE:%exf% "%%G" "%dst%"
:: Return to original
cd "%cur%"
:clean
del "%exf%"
GOTO end
:usage
ECHO Usage: %0 source destination
ECHO If destination does not exist, it will be created.
ECHO.
:end
答案2
为了完整起见,我想添加另一个答案。我不喜欢下面的程序,但无论如何。:)
另一种方法是添加观察程序来跟踪文件夹中的更改。观察者是一款持续监控一个或多个文件夹和子文件夹中文件变化的工具。它还可能触发自定义操作。
有一些应用程序可以用于此特定目的,但我找不到合适的。大多数是付费的,其他的是免费软件/开源的。文件监视实用程序看起来不错。
话虽如此,我的答案是:
- 设置项目结构,例如
C:\paulo\sources
。 - 创建输出文件夹,例如
C:\paulo\output
。 - 在相应文件夹添加观察者。
我编写了以下 Ruby 代码来监视sources
文件夹并查找pdf
文件。找到后,将文件复制到该output
文件夹中。
笔记:抱歉,Ruby 代码写得不好,因为我写得太匆忙了。
require 'rubygems'
require 'fssm'
require 'fileutils'
FSSM.monitor("C:/paulo/sources","**/*.pdf") do
update do |b, r|
FileUtils.cp r, "C:/paulo/output/#{r}"
end
create do |b, r|
FileUtils.cp r, "C:/paulo/output/#{r}"
end
end
然后我将这个脚本放到我的终端上运行。
每次pdf
创建/更新文件时,都会自动将副本发送到output
文件夹(当然,脚本必须在后台运行才能跟踪文件更改)。无需运行其他步骤。:)
答案3
在一个叫做“法律尽职调查”的过程中,我必须经常处理这种情况:我收到大量的 PDF,这些 PDF 被组织在文件夹中,必须全部阅读,不能错过任何一个。
我的做法是:
- 使用类似 unix 命令“ls”的命令将整个文件夹结构递归地打印到文本文件中。
- 我在 C:\exam 中启动一个 *.tex 文件并将此文本添加为第一章。它包含所有子文件夹和文件的名称。
- 现在我将所有子文件夹的名称添加为章节名称。
- 最后一步:大量使用包
pdfpages
:对于每个 pdf 我添加一行\includepdf[pages=-]{foldername/name-of-the-file.pdf}
pdftex 将所有内容编译为一个大型 pdf,通常我使用添加标题和页码scrpage2
。
就在昨天,我花了几分钟编辑了一份 978 页的 PDF。顺便说一句,这是最有趣的部分。现在我必须全部读完……