command line - Writing out only files existing in one directory or other or having different size or time of last modify - Ask Ubuntu
i writing script need compare 2 directories (recursively) , write out files if have different size or time of modify(yy-mm-dd hh:mm) or if file exists in 1 directory.
output in format:
<dir1>:<local-path> <size> <last-modify> <dir2>:<local-path> <size> <last-modify>
if file exists in 1 directory:
<dir1>:<local-path> <size> <last-modify>
or
<dir2>:<local-path> <size> <last-modify>
so far managed data in specified format using:
find dir1 -type f -exec stat -c '%n %s %y' {} \; | sed 's,^[^/]*/,,' | sed 's/\:[^:]*$//' | sort # > dir1.txt find dir2 -type f -exec stat -c '%n %s %y' {} \; | sed 's,^[^/]*/,,' | sed 's/\:[^:]*$//' | sort # > dir2.txt
which gives me 2 ordered lists of files in given directories , subdirectories , size , last modified timestamp.
now need somehow compare them , them specified format above. tried using diff -y compares line line need same name same name. tried comm dont know how transform output format.
any ideas?
i think i'd try put based around using rsync
in dry-run mode (--dry-run
or -n
).
to illustrate, given:
$ tree -ds adir/ bdir/ adir/ ├── [ 4096 nov 19 9:36] sub1 │ ├── [ 35 nov 19 9:35] common │ └── [ 23 nov 19 9:36] onlya ├── [ 4096 nov 19 9:41] sub2 │ ├── [ 35 nov 19 9:35] common │ ├── [ 44 nov 19 9:44] newera │ ├── [ 44 nov 19 9:37] oldera │ └── [ 6 nov 19 10:36] size └── [ 4096 nov 19 9:35] sub3 └── [ 35 nov 19 9:35] common bdir/ ├── [ 4096 nov 19 9:46] sub1 │ └── [ 35 nov 19 9:35] common ├── [ 4096 nov 19 10:36] sub2 │ ├── [ 35 nov 19 9:35] common │ ├── [ 44 nov 19 9:38] newera │ ├── [ 44 nov 19 9:44] oldera │ └── [ 24 nov 19 10:36] size └── [ 4096 nov 19 9:40] sub3 ├── [ 35 nov 19 9:35] common └── [ 23 nov 19 9:40] onlyb 6 directories, 14 files
then can list files have different sizes or modification times follows:
$ rsync -aon --delete --itemize-changes adir/ bdir/ *deleting sub3/onlyb >f+++++++++ sub1/onlya >f..t...... sub2/newera >f..t...... sub2/oldera >f.s....... sub2/size
[the change string doesn't matter our purposes, instance *deleting
indicates sub3/onlyb
not present in source directory; s
indicates size difference; t
indicates difference in modification time.]
unfortunately doesn't seem possible actual timestamps directly rsync output, can read file list , stat the corresponding files in each directory:
#!/bin/bash dira="$1" dirb="$2" rsync -aon --itemize-changes --delete "$dira"/ "$dirb"/ | while read -r c f ; printf '%s:%s ' "$dira" "$(cd "$dira" && stat -c '%n %s %y' "$f" 2>/dev/null || printf '(none) - - - -')" printf '%s:%s\n' "$dirb" "$(cd "$dirb" && stat -c '%n %s %y' "$f" 2>/dev/null || printf '(none) - - - -')" done
which can use follows
$ ./rstat.sh adir bdir | column -t adir:(none) - - - - bdir:sub3/onlyb 23 2016-11-19 09:40:12.253318393 -0500 adir:sub1/onlya 23 2016-11-19 09:36:52.220421434 -0500 bdir:(none) - - - - adir:sub2/newera 44 2016-11-19 09:44:45.953236221 -0500 bdir:sub2/newera 44 2016-11-19 09:38:33.270838033 -0500 adir:sub2/oldera 44 2016-11-19 09:37:41.675642039 -0500 bdir:sub2/oldera 44 2016-11-19 09:44:45.953236221 -0500 adir:sub2/size 6 2016-11-19 10:36:31.460487036 -0500 bdir:sub2/size 24 2016-11-19 10:36:31.460487036 -0500
Comments
Post a Comment