@elcubonegro/compare_files
v1.0.4
Published
compare files, the diff() returns either null if no changes have occurred, or an object with a type (which is either added, removed or changed) and a file property pointing to the (first) according file.
Downloads
7
Readme
Compare File Lists in Node.js
I encouter a certain situation pretty frequently: I have a known set of files on my file system which I need to scan to compare them against the same (or a similar) set of files at a later point in time (i.e. "Did any of the files in this list change?" or "Did any of the files matching these criteria change?").
A quick example:
import glob from 'glob' // from the `glob` package
const images_now = glob.sync('/home/images/**/*.jpg')
// Later (maybe even days or weeks later)
const images_later = glob.sync('/home/images/**/*.jpg')
// Do the files in images_now and images_later differ in any way?
The script below tackles this problem in a way as read-performant as possible (i.e. scan once, compare potentially many times). It checks if there are any differences between an earlier file list and the current file system and returns the first difference it finds.
Note: The script uses ES modules (transpiling most likely needed) and needs the
rev-hash
package to be installed.
It works as follows:
Scan the Files
We need to create a profile of the files we're interested in:
import { profile } from './compare-files.js'
profile(glob.sync('/home/images/**/*.jpg'))
Calling profile()
returns a plain JavaScript object. You may serialize and store it somewhere for later access.
Check for Changes
Comparing is the other way around: Read the stored profile and use diff()
:
import { diff } from './compare-files.js'
diff(
glob.sync('/home/images/**/*.jpg'),
referenceData // The object we obtained through profile() earlier
)
The diff()
returns either null
if no changes have occurred, or an object with a type
(which is either added
, removed
or changed
) and a file
property pointing to the (first) according file.
For example:
{ type: 'added', file: 'new.jpg' }
// or
{ type: 'removed', file: 'no-longer-exists.jpg' }
// or
{ type: 'changed', file: 'photoshopped.jpg' }
Note: If a difference is found, don't forget to invalidate the old profile and create a new one if needed.