Groovy: Hernoem bestanden recursief
Gepubliceerd op 29 July 2019
Mijn videospeler op mijn tv heeft zijn manier om te passeren
van het ene bestand naar het ander bij doorlopend lezen
en zijn afspeelmodus is om van 1…..mp4 naar 10….mp4 te gaan,
en niet van 1…mp4 tot 2….mp4.
Het probleem is dat er bijna 900 bestanden en mappen zijn.
Bingo een geweldig gebruikscasus van Groovy om te manipuleren
bestanden, hernoemen, zoeken naar een patroon in de bestandsnaam
of dossier.
Hier is het doel om de namen beginnend met te veranderen
een cijfer en waarvan het tweede karakter van de naam
is geen cijfer, ik zal een 0 aan het begin van deze naam toevoegen
renameFilesToStartWithTwoDigit.groovy
#!/usr/bin/env groovy
/**
* get a crossplateform separator
* @return
*/
static String getSeparator() {
System.getProperty("file.separator")
}
/**
* rename file
* @param file
* @param newName
* @return the renamed file
*/
static File rename(File file, String newName) {
assert file.renameTo(file
.parentFile.path +
getSeparator() +
newName)
new File(file
.parentFile.path +
getSeparator() +
newName)
}
String rootFolderPath = System.getProperty("user.home") +
"/Bureau/ng-courses/Udemy - Angular 7 " +
"(formerly Angular 2) - The Complete Guide"
File rootFolder = new File(rootFolderPath)
assert rootFolder.exists()
assert rootFolder.directory
assert rootFolder.canRead()
List<File> dirList = new ArrayList<>()
//Adding rootFolder in dirList
// just in case there is some files in it
dirList.add(rootFolder)
//looping to get list of directories
//recursively inside rootFolder
rootFolder.traverse { File file ->
!file.directory ?: dirList.add(file)
}
//looping through dirList
//to rename directories filling criterias
for (int i = dirList.size() - 1; i >= 0; i--) {
Character[] chars = dirList.get(i).name.chars
!(chars[0].digit && !chars[1].digit) ?:
dirList.set(i, rename(dirList.get(i),
"0${dirList.get(i).name}"))
if (dirList.get(i).directory) {
//looping through directory
//to rename file filling criterias
dirList.get(i).listFiles().each { File f ->
Character[] cs = f.name.chars
!(cs[0].digit && !cs[1].digit) ?:
rename(f, "0${f.name}")
}
}
}