我正在尝试使用以下命令从文件夹中填充 .fits 文件的所有名称的 txt:
ls *.fits > output_all.txt
文件夹中的 .fits 文件数 >330k,我收到错误消息
bash: /usr/bin/ls: Argument list too long
我该如何解决这个问题?
或者,可能完全避免创建文件output_all.txt
。我只需要它告诉STILTS工具哪些 .fits 文件用这个命令合并到一个大的 .fits 文件中
stilts tcat in=@output_all.txt out=table_stilts.fits icmd='keepcols "FLUX LOGLAM"'
如果您知道一种方法来告诉 STILTS 接受作为输入的目录,而不是文件,它将解决我的ls
. 肿瘤坏死因子
在
ls *.fits
中,shell 完成了所有艰苦的工作来查找以 . 结尾.fits
且不以 . 开头的文件名.
。然后它将该列表传递给
ls
,它对其进行排序(再次,因为 shell glob 在传递给之前已经对列表进行了排序ls
)并在之后显示它(在列或每行一个,具体取决于实现以及输出是否进入终端)检查每个文件是否存在。所以这有点适得其反,特别是考虑到:
--
选项分隔符,因此任何以开头的文件名-
都会导致问题。-d
选项,因此如果任何文件是目录类型,ls
则将列出其内容而不是它们本身。ls
是来自 shell 的单独命令(在大多数 shell 中,bash
包括execve()
如果您只需要打印由 shell 生成的列表 from
*.fits
,则可以使用printf
大多数 shell 中内置的列表(因此不会调用execve()
及其限制):但这留下了一个问题:
如果
*.fits
不匹配任何文件,则在bash
shell*.fits
中保持原样,printf
最终打印*.fits<newline>
.While
ls
会给你一个关于那个不存在的*.fits
文件的错误信息并output_all.txt
留空。这可以通过
nullglob
选项(bash 从中复制zsh
)来更改,这会导致*.fits
扩展为空。但是我们遇到了另一个问题:当除了格式之外没有传递任何参数时,printf
仍然会像传递空参数一样通过格式一次,所以你最终会得到一个空行output_all.txt
。可以解决这个问题:
如果您可以切换到
zsh
而不是bash
,它会变得更容易:where为那个 glob
N
启用并在 olumn 上打印其参数aw ,重要的是:如果没有传递任何参数,则不打印任何内容。nullglob
print -rC1
r
1
C
使用
zsh
,您还可以使用.
glob 限定符(*.fits(N.)
例如)将列表限制为仅常规文件(不包括目录、符号链接、fifos ..),或使用D
(*.fits(ND.)
)...包含隐藏文件最后,您也可以始终推迟
find
查找文件,但如果您确实需要对列表进行排序并排除隐藏文件,并且避免使用./
前缀,那么这也会很快变得乏味并且您需要 GNU 扩展。例如,对于 的等价物print -rC1 -- *.fits(N.)
:单个命令行上允许的字符数是有限制的。在现代 Linux 系统上,它大约有 200 万个字符。这可能在其他系统上有所不同。
看起来当前目录中的 *.fits 文件的文件名不适合单个命令行。有很多方法可以解决这个问题,最简单的一种是使用
find
。例如另一种选择是使用
perl
. 例如或者:
甚至:
(在 perl 中有很多方法可以做到这一点)。
注意:如果当前目录中存在任何隐藏文件名,该
find
版本将列出隐藏文件名(即以 a 开头的文件名)。.
perl 版本不会。两个版本都只会打印以 结尾的常规文件.fits
,而不是目录、符号链接、命名管道、套接字或设备节点。输出未find
排序,文件名按照它们在目录中的顺序打印。perl 版本是排序的(升序 alpha 排序。顺便说一句,perl 的内置排序功能足够灵活,可以按各种标准排序,包括文件的大小或时间戳)顺便说一句,perl 有一个File::Find库模块,它可以像
find
can 一样进行递归搜索,但具有 perl 的全部功能,可以过滤、排序和操作它找到的任何文件名,然后处理这些文件。File::Find
是一个核心库,包含在 perl 中。如果只需要搜索特定目录下的文件,perl 的glob()
功能就足够了。从浏览您发布的链接的 AFAICT
stilts
看来,stilts 的 arg 似乎in=@filename
不能处理 NUL 分隔的输入,因此如果您有任何 .fits 文件,文件名中嵌入了换行符,则需要重命名这些文件。如果
stilts
可以处理 NUL 分隔的文件名列表,您可以使用find
'-print0
选项或更改\n
perl 脚本中的\0
以生成 NUL 分隔的列表。这可能与 无关stilts
,但了解其他可以将 NUL 作为分隔符处理的程序是否遇到相同的问题很有用(许多程序都有一个-z
、-Z
和/或-0
选项)。或者