From all the files in a directory, the method shiftFilenamesOffset
is to increment the numeric part (int) of the alphanumeric filename by offset each time, and rename the files. A negative offset is also allowed.
Example:
offset: -2
Old filename: New filename:
Textdokument (neu) 3.txt -> Textdokument (neu) 1.txt
Textdokument (neu) 5.4.1txt -> Textdokument (neu) 5.2.1txt
Textdokument (neu) 5.txt -> Textdokument (neu) 3.txt
Textdokument (neu) 6.txt -> Textdokument (neu) 4.txt
import java.io.File;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NFiles {
record Filename(File file, String prefix, int number, String ending) {
}
private static final String regex = "(.*)(\\d+)\\.([^.]*)";
private static final Pattern pattern = Pattern.compile(regex);
public static void shiftFilenamesOffset(final File dir, final int offset) {
Comparator<Filename> filenameComparator = offset <= 0 ? Comparator.comparingInt(Filename::number) : Comparator.comparingInt(Filename::number)
.reversed();
Arrays.stream(Objects.requireNonNull(dir.listFiles()))
.filter(f -> pattern.matcher(f.getName()).find())
.map(f -> {
Matcher mat = pattern.matcher(f.getName());
mat.find();
return new Filename(f, mat.group(1), Integer.parseInt(mat.group(2)), mat.group(3));
})
.sorted(filenameComparator)
.forEach(fn -> {
File nf = new File(fn.file().getParent(), fn.prefix() + (fn.number() + offset) + "." + fn.ending());
System.out.println(fn + " -> " + nf + " -> " + fn.file().renameTo(nf));
});
}
public static void main(final String[] args) {
shiftFilenamesOffset(new File("test1"), -3);
}
}