Skip to content

Instantly share code, notes, and snippets.

@froop
Created January 31, 2015 07:07
Show Gist options
  • Save froop/0c7eee8c6fe27c95ca84 to your computer and use it in GitHub Desktop.
Save froop/0c7eee8c6fe27c95ca84 to your computer and use it in GitHub Desktop.
[Java] 指定ディレクトリ下全ファイルのファイル名と内容テキストを一括置換
public class FileRename {
private final Path srcDir;
private final Path destDir;
private final Iterable<RenamePattern> namePatterns;
private final Iterable<RenamePattern> contentPatterns;
private final Charset charset;
public FileRename(Path srcDir, Path destDir,
Iterable<RenamePattern> namePatterns, Iterable<RenamePattern> contentPatterns) {
this(srcDir, destDir, namePatterns, contentPatterns, Charset.defaultCharset());
}
public FileRename(Path srcDir, Path destDir,
Iterable<RenamePattern> namePatterns, Iterable<RenamePattern> contentPatterns,
Charset charset) {
this.srcDir = Objects.requireNonNull(srcDir);
this.destDir = Objects.requireNonNull(destDir);
this.namePatterns = Objects.requireNonNull(namePatterns);
this.contentPatterns = Objects.requireNonNull(contentPatterns);
this.charset = Objects.requireNonNull(charset);
}
public void execute() throws IOException {
Files.walkFileTree(srcDir, new RenameFileVisitor(srcDir, destDir));
}
private class RenameFileVisitor extends SimpleFileVisitor<Path> {
private final Path srcParent;
private final Path destParent;
public RenameFileVisitor(Path srcParent, Path destParent) {
this.srcParent = Objects.requireNonNull(srcParent);
this.destParent = Objects.requireNonNull(destParent);
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
if (dir.equals(srcParent)) {
Files.createDirectory(destParent);
return FileVisitResult.CONTINUE;
} else {
Path destSub = destParent.resolve(dir.getFileName());
Files.walkFileTree(dir, new RenameFileVisitor(dir, destSub));
return FileVisitResult.SKIP_SUBTREE;
}
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
Path destFile = buildDestFilePath(file);
String srcText = new String(Files.readAllBytes(file), charset);
writeFile(destFile, srcText);
return FileVisitResult.CONTINUE;
}
private Path buildDestFilePath(Path file) {
String srcName = file.getFileName().toString();
String destName = replace(srcName, namePatterns);
return destParent.resolve(destName);
}
private void writeFile(Path file, String text)
throws IOException {
String destText = replace(text, contentPatterns);
Files.write(file, destText.getBytes(charset),
StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);
}
private String replace(String text, Iterable<RenamePattern> patterns) {
String res = text;
for (RenamePattern item : patterns) {
res = item.getPattern().matcher(res).replaceAll(item.getReplacement());
}
return res;
}
}
public static class RenamePattern {
private final Pattern pattern;
private final String replacement;
public RenamePattern(String pattern, String replacement) {
this(Pattern.compile(pattern), replacement);
}
public RenamePattern(Pattern pattern, String replacement) {
this.pattern = Objects.requireNonNull(pattern);
this.replacement = Objects.requireNonNull(replacement);
}
public Pattern getPattern() {
return pattern;
}
public String getReplacement() {
return replacement;
}
}
}
public class Sample {
public static void main(String[] args) throws IOException {
Path srcDir = Paths.get("test/sample1");
Path destDir = Paths.get("test/sample2");
List<RenamePattern> patterns = Arrays.asList(
new RenamePattern("sample1", "sample2"),
new RenamePattern("Sample1", "Sample2"));
new FileRename(srcDir, destDir, patterns, patterns).execute();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment