所以我有这个命令行可以工作。
find . -type f |xargs ls -lS |head -20
问题是我只希望输出为文件大小和名称。我试过了:
find . -type f -printf '%s %p\n' |xargs ls -lS |head -20
但这给了我一堆'无法访问[inode],没有这样的文件或目录'错误。
我的目标是打印目录中最大的20个文件,而不是使用ls。
答案 0 :(得分:2)
在问题中,您声明:
我的目标是打印目录中最大的20个文件,而不是使用ls。
这意味着可接受的解决方案不应使用 ls
。
另一个问题是使用xargs
。类似find . -type f | xargs ls
的构造不适用于包含空格的子目录或文件名,因为它会在将字符串find
分割之前将其分割为ls
。您可以使用空终止字符串保护字符串或解决此问题,例如find . -type f -print0 | xargs -0 ls
。通常,使用xargs
有security considerations。与其验证xargs
构造是否安全无关,而不是完全避免使用它(特别是如果您不需要它)。
尝试打印没有ls
且没有xargs
的最大的20个文件:
find . -type f -printf '%s %p\n' | sort -rn | head -20
答案 1 :(得分:2)
没有ls
的答案:
find . -type f -printf '%k %p\n' |sort -n |tail -n 20
这给每个文件列出了大小(以kB为单位),一个空格,然后是文件名,按数字排序,然后你得到最后20个项目(最大的20个)。
你的问题出现在ls
。
如果你有一个真正的大目录结构,sort
将会失败。您必须使用仅存储最多20个项目的自定义代码。
答案 2 :(得分:0)
使用以下命令获取linux中的文件大小。
du -h <<FileName>>
或者
du -h <<FilePath>>
答案 3 :(得分:0)
xargs
从前一个命令获取每一行输出,并且基本上在其参数的末尾打了一针,所以你的find会打印类似
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
答案 4 :(得分:0)
find . -type f |xargs ls -lS |head -20 | awk '{print $9, $5}'
由于ls
的输出是柱状的,只需打印正确的列即可完成。