所以我有这个可以使用的命令行。
find . -type f |xargs ls -lS |head -20
问题是我只想输出文件大小和名称。我试过:
find . -type f -printf '%s %p\n' |xargs ls -lS |head -20
但这给了我一堆“无法访问[inode],没有这样的文件或目录”错误。
我的目标是打印目录中最大的 20 个文件,而不是使用 ls。
不涉及
ls
的答案:
find . -type f -printf '%k %p\n' |sort -n |tail -n 20
这将为每个文件列出大小(以 kB 为单位)、一个空格,然后是按数字排序的文件名,然后您将获得最后 20 个项目(最大的 20 个)。
您的问题在于管道到
ls
。
如果你有一个真正大的目录结构,
sort
将会崩溃。如果您已经知道大致大小并且大多数文件要小得多,您可以告诉 find
使用附加选项排除较小的大小,例如find . -type f -size +2M -printf …
删除 2MiB 以下的任何内容。否则,您必须使用一些仅存储最大 20 个项目的自定义代码。
使用以下命令获取 Linux 中 fiule 的大小。
du -h <<FileName>>
或者
du -h <<FilePath>>
在问题中,您说:
我的目标是打印目录中最大的 20 个文件,而不是使用 ls。
这意味着可接受的解决方案不应该使用
ls
。
另一个问题是
xargs
的使用。像 find . -type f | xargs ls
这样的结构不适用于包含空格的子目录或文件名,因为它会先将字符串从 find
中拆分出来,然后再将其交给 ls
。您可以保护字符串或使用以 null 结尾的字符串(例如 find . -type f -print0 | xargs -0 ls
)解决此问题。一般来说,使用xargs
有安全考虑。与其验证您的
xargs
构造是否安全,不如完全避免使用它(特别是当您不需要它时)。
尝试打印不带
ls
和不带 xargs
的 20 个最大文件:
find . -type f -printf '%s %p\n' | sort -rn | head -20
find . -type f |xargs ls -lS |head -20 | awk '{print $9, $5}'
由于
ls
的输出是柱状的,只需打印正确的列即可完成。
xargs
获取上一个命令的每一行输出,并基本上在其参数末尾进行拍打,因此您的查找结果打印类似
123 ./somefile.txt
xargs
变成
ls -lS 123 ./somefile.txt
除非您在该目录中确实有一个名为
123
的文件,否则您会收到“无法访问”错误:
marc@panic:~$ touch foo
marc@panic:~$ ls -lS file_that_does_not_exist foo
ls: cannot access file_that_does_not_exist: No such file or directory
-rw-rw-r-- 1 marc marc 0 Feb 3 14:26 foo