问题的上下文:根据POSIX 规范, ARG_MAX 是函数系列的命令行参数的最大长度exec()。这让我相信这是实际的参数数量,但这显然不起作用:
$ ulimit -s
8192
$ touch {1..18000}.jpg
$ rm *.jpg
$
Run Code Online (Sandbox Code Playgroud)
显然,尽管长度超过 8192 个项目,但效果很好。根据DW 的回答,8192应该以 kB 为单位的大小。很明显,之前的假设是错误的。
这是实际的问题进来:我如何找出项目的实际金额将获得上述8192 KB的限制?换句话说,我必须执行什么样的计算才能确保这种*.jpg类型的 glob 会导致Argument list too long错误?
请注意,这不是What 定义单个命令参数的最大大小的副本。我知道getconf ARG_MAX和ulimit -s价值观,这不是我的问题。我需要知道如何生成大小超过 limit 的足够多的参数。换句话说,我需要找到一种方法来获取错误,而不是避免它。
在ARG_MAX之后,新进程的最大参数长度似乎ARG_MAX在运行 Ubuntu 12.04 的 Mac Mini 3,1 上定义错误(或至少含糊不清):
$ getconf ARG_MAX # arguments
2097152
$ locate limits.h | xargs grep -ho 'ARG_MAX[ \t]\+[0-9]\+' | uniq | cut -d ' ' -f 8
131072
Run Code Online (Sandbox Code Playgroud)
实际限制似乎介于以下之间:
$ cd "$(mktemp -d)"
$ touch $(seq 1 131072) && find . -mindepth 1 -printf x | wc -c && rm *
131072
$ touch $(seq 1 131073) && find . -mindepth 1 -printf x | wc -c && rm …Run Code Online (Sandbox Code Playgroud) 我正在处理数千个文件,其名称包含从 2001-01-01 到 2020-12-31 的连续日期。
此类文件的示例如下所示:
gpm_original_20010101.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010101_cor_method-add_fac-0.5_pass-5_radius-30km.nc
.
.
.
gpm_original_20010131.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-1_radius-500km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-2_radius-250km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-3_radius-150km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-4_radius-75km.nc
gpm_cressman_20010131_cor_method-add_fac-0.5_pass-5_radius-30km.nc
Run Code Online (Sandbox Code Playgroud)
依此类推,直到2020-12-31。我需要做的是根据年份和月份将这些文件重新组织到新文件夹中。
目录树需要遵循year子目录的逻辑months,如下所示:
2001
01
02
03
04
05
06
07
08
09
10
11
12
2002
01
02
03
04
05
06
07
08
09
10
11
12
Run Code Online (Sandbox Code Playgroud)
等等。并且应该根据文件名中的等效日期将文件移动到这些目录。例如:200101xx名称中包含的所有文件都应移动到该2001/01文件夹中。
使用 bash 实现这一目标的最直接方法是什么?