Hi @andrews96921672, in this case I have a function that was ready to go. I just added a bit for selecting your new part number folder. Let me know if this is what you had in mind. Feel free to adjust the script if I haven't understood your requirements right.
- Mark
/**
* Re-links part number files to a new folder
* that is named for the part number.
* Usage: open the document, run script, select
* new part folder, eg. "12345", and script will
* NOTE: the method for deriving the old part number
* is simplistic and might need to be refined.
* relink "my/link/path/25247/subfolder/subfolder/25247 - 1.jpg"
* to "my/link/path/12345/subfolder/subfolder/12345 - 1.jpg"
* @author m1b
* @discussion https://community.adobe.com/t5/indesign-discussions/looking-for-help-with-batch-relinking-script-for-images-with-the-same-suffix/m-p/14312976
*/
function main() {
var doc = app.activeDocument,
oldPartNumber = getOldPartNumber(doc);
if (!oldPartNumber)
return alert('Could not get old part number from document.');
var newPartNumber = getFirstParentNumberFolder();
if (!newPartNumber)
return alert('Could not get new part number from that folder.');
// perform the find change
findChangeLinkPath(
// the document to search in
doc,
// find the existing part number
new RegExp('\\b' + oldPartNumber + '\\b', 'g'),
// change to the new part number
newPartNumber,
// update the links
true,
// show results alert
true,
);
/**
* Returns the new part number
* by asking user for folder and
* searching (node to root) for
* first folder which is a number.
* @returns {Number}
*/
function getFirstParentNumberFolder() {
var folder = Folder.selectDialog("Select part number folder:");
if (null === folder)
return;
// look for folder whose name is a number
while (
undefined != folder.parent
&& String(Number(folder.name)) != folder.name
)
folder = folder.parent;
if (undefined == folder.parent)
return
// expects folder name to be the part number
var partNumber = Number(folder.name);
if (isNaN(partNumber))
return;
return partNumber;
};
/**
* Returns a five-digit part number.
* Important: it works by returning
* the first five-digit number found
* at start of _two_ link filenames.
* @param {Document} doc
* @returns {Number}
*/
function getOldPartNumber(doc) {
var oldLinkPaths = doc.links.everyItem().linkResourceURI,
oldPartNumber;
for (var i = 0; i < oldLinkPaths.length; i++) {
var num = decodeURI(File(oldLinkPaths[i]).name).match(/^(\d{5})\b/);
if (
!num
|| num.length < 1
|| isNaN(num = Number(num[0]))
)
continue;
if (num == oldPartNumber)
break;
oldPartNumber = num;
}
return num;
};
};
app.doScript(main, ScriptLanguage.JAVASCRIPT, undefined, UndoModes.ENTIRE_SCRIPT, "Change Part Number");
/**
* Performs find/change on link paths of document.
* @author m1b
* @version 2022-02-07
* @param {Document} doc - an Indesign Document.
* @param {RegExp|String} findWhat - RegExp or string to find in link path.
* @param {RegExp|String} changeTo - replace with this.
* @param {Boolean} [updateLinks] - whether to update the links (default: true).
* @param {Boolean} [showResults] - whether to display a count of the changes (default: false).
*/
function findChangeLinkPath(doc, findWhat, changeTo, updateLinks, showResults) {
updateLinks = false !== updateLinks;
showResults = true === showResults;
var links = doc.links,
counter = 0;
for (var i = 0; i < links.length; i++) {
var linkURI = links[i].linkResourceURI,
newLinkedURI = linkURI.replace(findWhat, changeTo);
if (linkURI == newLinkedURI)
continue;
links[i].reinitLink(newLinkedURI);
counter++
if (
updateLinks
&& LinkStatus.LINK_OUT_OF_DATE === links[i].status
)
links[i].update();
}
if (showResults)
alert('Reinit ' + counter + ' out of ' + links.length + ' links.');
};
Edit 2023-12-22: After better understanding OP's file structure, adjusted script to derive the old part number from the document, then change to the new part number in all link paths.