(ignore_dotfiles && name[0] == '.');
}
-void print_size_sum(size_sum_t s) {
- char tmp[100];
- char *a = tmp + sizeof(tmp)/sizeof(char);
- *(--a) = '\0';
- if(s) {
- while(s) {
- *(--a) = s%10 + '0';
- s /= 10;
- }
- } else {
- *(--a) = '0';
- }
- printf(a);
-}
-
/**********************************************************************/
struct file_with_size {
void print_file(struct file_with_size *node) {
char tmp[PATH_MAX + 1];
if(show_realpaths) {
- if(show_groups) {
- realpath(node->filename, tmp);
- printf("%d %s\n", node->group_id, tmp);
+ if(realpath(node->filename, tmp)) {
+ if(show_groups) {
+ printf("%d %s\n", node->group_id, tmp);
+ } else {
+ printf("%s\n", tmp);
+ }
} else {
- realpath(node->filename, tmp);
- printf("%s\n", tmp);
+ printf("Can not get the realpath of \"%s\": %s\n",
+ node->filename,
+ strerror(errno));
+ exit(EXIT_FAILURE);
}
} else {
if(show_groups) {
int width;
if(show_progress && tty_width > 0) {
width = tty_width - 7;
- p = (width * n) / max;
+ p = (width * n) / (max - 1);
if(p > *pp) {
for(k = 0; k < p; k++) {
fprintf(stderr, "+");
fprintf(stderr, "-");
}
*pp = p;
- p = (100 * n) / max;
- fprintf(stderr, " [% 3d%%]\r", p);
+ p = (100 * n) / (max - 1);
+ fprintf(stderr, " [%3d%%]\r", p);
}
}
}
struct file_with_size *list1, *list2;
struct file_with_size *node1, *node2;
int not_in, found;
- int k, pp, l1, n;
+ int nb_groups, nb_nodes;
+ int list1_length, previous_progress;
char *buffer1 = safe_malloc(sizeof(char) * READ_BUFFER_SIZE);
char *buffer2 = safe_malloc(sizeof(char) * READ_BUFFER_SIZE);
if(dirname2) {
if(strncmp(dirname2, "not:", 4) == 0) {
not_in = 1;
- /* We should show groups even in that mode. However they are not
- properly calculated for now, so we force it off. */
+ /* groups are not computed in the not: mode */
show_groups = 0;
dirname2 += 4;
+ } else if(strncmp(dirname2, "and:", 4) == 0) {
+ dirname2 += 4;
}
if(show_progress) {
fprintf(stderr, "%s ... ", dirname2);
fprintf(stderr, "done.\n");
}
- k = 0;
- pp = -1;
- n = 0;
- l1 = file_list_length(list1);
+ nb_groups = 0;
+ previous_progress = -1;
+ nb_nodes = 0;
+ list1_length = file_list_length(list1);
if(not_in) {
for(node1 = list1; node1; node1 = node1->next) {
- print_progress(l1, n, &pp);
- n++;
+ print_progress(list1_length, nb_nodes, &previous_progress);
+ nb_nodes++;
found = 0;
} else {
for(node1 = list1; node1; node1 = node1->next) {
- print_progress(l1, n, &pp);
- n++;
+ print_progress(list1_length, nb_nodes, &previous_progress);
+ nb_nodes++;
for(node2 = list2; node2; node2 = node2->next) {
if(node1->group_id < 0 || node2->group_id < 0) {
if(node2->group_id >= 0) {
node1->group_id = node2->group_id;
} else {
- node1->group_id = k;
+ node1->group_id = nb_groups;
node1->dir_id = 1;
- k++;
+ nb_groups++;
}
}
if(node2->group_id < 0) {
}
void print_help(FILE *out) {
- fprintf(out, "Usage: finddup [OPTION]... DIR1 [[not:]DIR2]\n");
+ fprintf(out, "Usage: finddup [OPTION]... DIR1 [[and:|not:]DIR2]\n");
fprintf(out, "Version %s (%s)\n", VERSION_NUMBER, UNAME);
- fprintf(out, "Without DIR2, lists duplicated files found in DIR1. With DIR2, lists files common to both directories. With the not: prefix, lists files found in DIR1 which do not exist in DIR2.\n");
+ fprintf(out, "Without DIR2, lists duplicated files found in DIR1. With DIR2, lists files common to both directories. With the not: prefix, lists files found in DIR1 which do not exist in DIR2. The and: prefix is the default and should be used only if you have a directory starting with 'not:'\n");
fprintf(out, "\n");
fprintf(out, " -h show this help\n");
fprintf(out, " -d ignore dot files and directories\n");