28 lines
1.6 KiB
Plaintext
Executable File
28 lines
1.6 KiB
Plaintext
Executable File
#!/usr/bin/java --source 11
|
|
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes;
|
|
public class Main {
|
|
/** @param args directory, sourcePrefix, targetPrefix */
|
|
public static void main(String[] args) throws IOException {
|
|
Path dir = Path.of(args[0]).toAbsolutePath().normalize();
|
|
Path sourcePrefix = dir.resolve(Path.of(args[1])).normalize();
|
|
Path targetPrefix = dir.resolve(Path.of(args[2])).normalize();
|
|
System.out.printf("Replacing symlinks in '%s' from '%s' to '%s'%n", dir, sourcePrefix, targetPrefix);
|
|
Files.walkFileTree(dir, new SimpleFileVisitor<>() {
|
|
@Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
|
|
if (attrs.isSymbolicLink()) {
|
|
var originalTarget = Files.readSymbolicLink(file).normalize();
|
|
if (originalTarget.startsWith(sourcePrefix)) {
|
|
var symlinkFileDir = file.getParent();
|
|
originalTarget = symlinkFileDir.resolve(originalTarget);
|
|
Files.delete(file);
|
|
var target = symlinkFileDir.relativize(targetPrefix.resolve(sourcePrefix.relativize(originalTarget))).normalize();
|
|
Files.createSymbolicLink(file, target);
|
|
System.out.printf("Symlink at '%s' pointing at '%s' is now pointing at '%s'%n", file, originalTarget, target);
|
|
}
|
|
}
|
|
return FileVisitResult.CONTINUE;
|
|
}
|
|
});
|
|
}
|
|
}
|