*
*/
-#define VERSION_NUMBER "1.0"
+#define VERSION_NUMBER "1.1"
#define _BSD_SOURCE
two files with same inode will
always be false */
+int sort_by_time = 0; /* 1 means to sort files in each group according
+ to the modification time */
+
/********************************************************************/
/* malloc with error checking. */
struct file_node *next;
char *name;
size_t size;
+ time_t atime, mtime, ctime;
ino_t inode;
int group_id; /* one per identical file content */
int dir_id; /* 1 for DIR1, and 2 for DIR2 */
tmp->next = tail;
tmp->name = strdup(name);
tmp->size = sb.st_size;
+ tmp->atime = sb.st_atime;
+ tmp->mtime = sb.st_mtime;
+ tmp->ctime = sb.st_ctime;
tmp->inode = sb.st_ino;
tmp->group_id = -1;
tmp->dir_id = -1;
} else if((*f1)->group_id > (*f2)->group_id) {
return 1;
} else {
- if((*f1)->dir_id < (*f2)->dir_id) {
- return -1;
- } else if((*f1)->dir_id > (*f2)->dir_id) {
- return 1;
+ if(sort_by_time) {
+ if((*f1)->mtime < (*f2)->mtime) {
+ return -1;
+ } else if((*f1)->mtime > (*f2)->mtime) {
+ return 1;
+ } else {
+ return 0;
+ }
} else {
- return 0;
+ if((*f1)->dir_id < (*f2)->dir_id) {
+ return -1;
+ } else if((*f1)->dir_id > (*f2)->dir_id) {
+ return 1;
+ } else {
+ return 0;
+ }
}
}
}
};
void print_progress(struct progress_state *state) {
- int position, k;
+ int position, k, normalizer;
struct winsize win;
char buffer[PROGRESS_BUFFER_SIZE];
char *s;
+ normalizer = (state->nb_values > 1 ? state->nb_values - 1 : 1);
+
if(show_progress) {
/* We use the previous bar_width to compute the position, so that
we avoid doing too many ioctls */
- position = (state->bar_width * state->value) / (state->nb_values - 1);
+ position = (state->bar_width * state->value) / normalizer;
if(state->bar_width <= 0 || position != state->last_position) {
if(!ioctl (STDERR_FILENO, TIOCGWINSZ, (char *) &win)) {
/* Something weird is going on if the previous test is wrong */
} else {
state->bar_width = win.ws_col - 7;
}
- position = (state->bar_width * state->value) / (state->nb_values - 1);
+ position = (state->bar_width * state->value) / normalizer;
state->last_position = position;
s = buffer;
for(k = 0; k < position; k++) {
/* We need four % because of the fprintf that follows */
sprintf(s, " [%3d%%%%]\r",
- (100 * state->value) / (state->nb_values - 1));
+ (100 * state->value) / normalizer);
fprintf(stderr, buffer);
}
fprintf(out, " -c, --hide-matchings do not show which files in DIR2 corresponds to\n");
fprintf(out, " those in DIR1\n");
fprintf(out, " -g, --no-group-ids do not show the file groups\n");
+ fprintf(out, " -t, --time-sort sort according to modification time in each group\n");
fprintf(out, " -p, --show-progress show progress\n");
fprintf(out, " -r, --real-paths show the real file paths\n");
fprintf(out, " -i, --same-inodes-are-different\n");
{ "real-paths", no_argument, 0, 'r' },
{ "hide-matchings", no_argument, 0, 'c' },
{ "no-group-ids", no_argument, 0, 'g' },
+ { "time-sort", no_argument, 0, 't' },
{ "ignore-dots", no_argument, 0, 'd' },
{ "ignore-empty", no_argument, 0, '0' },
{ "show-progress", no_argument, 0, 'p' },
setlocale (LC_ALL, "");
- while ((c = getopt_long(argc, argv, "hircgd0pm",
+ while ((c = getopt_long(argc, argv, "hircgtd0pm",
long_options, NULL)) != -1) {
switch (c) {
show_groups = 0;
break;
+ case 't':
+ sort_by_time = 1;
+ break;
+
case 'p':
show_progress = 1;
break;