static int lfs_project(int argc, char **argv);
#endif
static int lfs_flushctx(int argc, char **argv);
-static int lfs_cp(int argc, char **argv);
-static int lfs_ls(int argc, char **argv);
static int lfs_poollist(int argc, char **argv);
static int lfs_changelog(int argc, char **argv);
static int lfs_changelog_clear(int argc, char **argv);
{"find", lfs_find, 0,
"find files matching given attributes recursively in directory tree.\n"
"usage: find <directory|filename> ...\n"
- " [[!] --atime|-A [+-]N] [[!] --ctime|-C [+-]N]\n"
- " [[!] --mtime|-M [+-]N] [--maxdepth|-D N] [[!] --blocks|-b N]\n"
+ " [[!] --atime|-A [+-]N[smhdwy]] [[!] --ctime|-C [+-]N[smhdwy]]\n"
+ " [[!] --mtime|-M [+-]N[smhdwy]] [[!] --blocks|-b N]\n"
+ " [--maxdepth|-D N] [[!] --mdt-index|--mdt|-m <uuid|index,...>]\n"
" [[!] --name|-n <pattern>] [[!] --ost|-O <uuid|index,...>]\n"
" [--print|-P] [--print0|-0] [[!] --size|-s [+-]N[bkMGTPE]]\n"
" [[!] --stripe-count|-c [+-]<stripes>]\n"
#endif
{"flushctx", lfs_flushctx, 0, "Flush security context for current user.\n"
"usage: flushctx [-k] [mountpoint...]"},
- {"cp", lfs_cp, 0,
- "Remote user copy files and directories.\n"
- "usage: cp [OPTION]... [-T] SOURCE DEST\n\tcp [OPTION]... SOURCE... DIRECTORY\n\tcp [OPTION]... -t DIRECTORY SOURCE..."},
- {"ls", lfs_ls, 0,
- "Remote user list directory contents.\n"
- "usage: ls [OPTION]... [FILE]..."},
{"changelog", lfs_changelog, 0,
"Show the metadata changes on an MDT."
"\nusage: changelog <mdtname> [startrec [endrec]]"},
return llapi_poollist(argv[1]);
}
-static int set_time(time_t *time, time_t *set, char *str)
+static time_t set_time(struct find_param *param, time_t *time, time_t *set,
+ char *str)
{
- time_t t;
+ long long t = 0;
int res = 0;
- char *endptr;
+ char *endptr = "AD";
+ char *timebuf;
if (str[0] == '+')
res = 1;
if (res)
str++;
- t = strtol(str, &endptr, 0);
- if (*endptr != '\0') {
- fprintf(stderr,
- "%s find: bad time '%s': %s\n",
- progname, str, strerror(EINVAL));
- return INT_MAX;
+ for (timebuf = str; *endptr && *(endptr + 1); timebuf = endptr + 1) {
+ long long val = strtoll(timebuf, &endptr, 0);
+ int unit = 1;
+
+ switch (*endptr) {
+ case 'y':
+ unit *= 52; /* 52 weeks + 1 day below */
+ case 'w': /* fallthrough */
+ unit *= 7;
+ case '\0': /* days are default unit if none used */
+ case 'd': /* fallthrough */
+ unit = (unit + (*endptr == 'y')) * 24;
+ case 'h': /* fallthrough */
+ unit *= 60;
+ case 'm': /* fallthrough */
+ unit *= 60;
+ case 's': /* fallthrough */
+ break;
+ /* don't need to multiply by 1 for seconds */
+ default:
+ fprintf(stderr,
+ "%s find: bad time string '%s': %s\n",
+ progname, timebuf, strerror(EINVAL));
+ return LONG_MAX;
+ }
+
+ if (param->fp_time_margin == 0 ||
+ (*endptr && unit < param->fp_time_margin))
+ param->fp_time_margin = unit;
+
+ t += val * unit;
}
- if (*time < t * 24 * 60 * 60) {
+ if (*time < t) {
if (res != 0)
str--;
- fprintf(stderr,
- "%s find: bad time '%s': too large\n",
+ fprintf(stderr, "%s find: bad time '%s': too large\n",
progname, str);
- return INT_MAX;
+ return LONG_MAX;
}
- *set = *time - t * 24 * 60 * 60;
+ *set = *time - t;
+
return res;
}
struct find_param param = {
.fp_max_depth = -1,
.fp_quiet = 1,
+ .fp_time_margin = 24 * 60 * 60,
};
struct option long_opts[] = {
{ .val = 'A', .name = "atime", .has_arg = required_argument },
{ .val = 'U', .name = "user", .has_arg = required_argument },
/* getstripe { .val = 'v', .name = "verbose", .has_arg = no_argument }, */
/* getstripe { .val = 'y', .name = "yaml", .has_arg = no_argument }, */
+ { .val = 'z', .name = "lazy", .has_arg = no_argument },
{ .name = NULL } };
int pathstart = -1;
int pathend = -1;
/* when getopt_long_only() hits '!' it returns 1, puts "!" in optarg */
while ((c = getopt_long_only(argc, argv,
- "-0A:b:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:v",
+ "-0A:b:c:C:D:E:g:G:H:i:L:m:M:n:N:O:Ppqrs:S:t:T:u:U:vz",
long_opts, NULL)) >= 0) {
xtime = NULL;
xsign = NULL;
xsign = ¶m.fp_msign;
param.fp_exclude_mtime = !!neg_opt;
}
- rc = set_time(&t, xtime, optarg);
- if (rc == INT_MAX) {
+ rc = set_time(¶m, &t, xtime, optarg);
+ if (rc == LONG_MAX) {
ret = -1;
goto err;
}
param.fp_check_mdt_count = 1;
param.fp_exclude_mdt_count = !!neg_opt;
break;
+ case 'z':
+ param.fp_lazy = 1;
+ break;
default:
ret = CMD_HELP;
goto err;
return rc;
}
-static int lfs_cp(int argc, char **argv)
-{
- fprintf(stderr, "remote client copy file(s).\n"
- "obsolete, does not support it anymore.\n");
- return 0;
-}
-
-static int lfs_ls(int argc, char **argv)
-{
- fprintf(stderr, "remote client lists directory contents.\n"
- "obsolete, does not support it anymore.\n");
- return 0;
-}
-
static int lfs_changelog(int argc, char **argv)
{
void *changelog_priv;