我目前有一个日志文件(见下文),我需要迭代并提取扫描的文件列表。然后,通过使用该文件列表将扫描的文件复制到不同的目录中。
所以在这种情况下,它会经历并拉动 C:\工具\ baregrep.exe C:\工具\ baretail.exe 等等
然后将它们移动到一个文件夹,例如具有相同文件结构的c:\ folder \ SafeFolder
我希望我有一个关于扫描失败时输出结果的样本,但是这将使我有一个良好的开端,我可以想出其余的
先谢谢了,我真的很感激您可以借给我的任何帮助。
答案 0 :(得分:1)
这个问题被标记为Java,并且尽管我喜欢Java,但这个问题可以更容易,更快速地用Perl等语言解决(所以如果你只想要最终结果而不需要在特定环境中运行,然后您可能希望使用脚本语言。)
不是一个有效的实现,但是下面的代码就是perl所需的全部内容:(语法未经测试,可能会被破坏,仅用作指南......自从我编写任何perl以来已经有一段时间了。)< / p>
use File::Copy;
my $outdir = "c:/out/";
while(<>)
{
my ($path) = /Processing File\s+\'([^\']+)\'/;
my ($file) = $path =~ /(.*\\)+([^\\]+)/;
if (($file) && (-e $path))
{
copy($path,$outdir . $file);
}
}
答案 1 :(得分:0)
直截了当。
使用NEW_LINE作为分隔符逐行读取日志文件。如果这是一个小文件,请随意加载它&amp;通过String.split(“\ n”)或StringTokenizer
当你循环每一行时,你需要做一个简单的测试来检测该字符串是否包含'处理文件'。
如果是这样,使用正则表达式(更难)或简单解析来捕获文件名。它应该在[']之内,因此检测第一次出现的['],然后检测第二次出现,并获取它们之间的字符串。
如果您的字符串有效(您可以使用java.io.File测试)或现有字符串,则可以将文件名复制到另一个文件。我不建议你不要在java中复制它以获取初学者的内存限制。
相反,复制文件字符串以形成批处理文件,使用OS脚本(如Windows BAT或Bash脚本)立即复制它们,例如cp'filename_from''copy_to_dir'
让我知道你需要一个有效的例子
问候
答案 2 :(得分:0)
这应该可以解决问题。现在,只需适应您的解决方案!
public static void find(String logPath, String safeFolder) throws FileNotFoundException, IOException {
ArrayList<File> files = new ArrayList<File>();
BufferedReader br = new BufferedReader(new FileReader(logPath));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
Pattern pattern = Pattern.compile("'[a-zA-Z]:\\\\.+?'");
Matcher matcher = pattern.matcher(line);
if (matcher.matches()) {
}
if (matcher.find()) {
files.add(new File(matcher.group()));
System.out.println("Got a new file! " + files.get(files.size() - 1));
}
}
for (File f : files) {
// Make sure we get a file indeed
if (f.exists()) {
if (!f.renameTo(new File(safeFolder, f.getName()))) {
System.err.println("Unable to move file! " + f);
}
} else {
System.out.println("I got a wrong file! " + f);
}
}
}