我有一个可用的命令行。
find . -type f |xargs ls -lS |head -20
我只想输出文件大小和名称。我尝试了以下代码:
find . -type f -printf '%s %p\n' |xargs ls -lS |head -20
但是这给我带来了许多“无法访问[inode],没有这样的文件或目录”的错误。我的目标是打印目录中最大的20个文件,而不使用ls命令。
我有一个可用的命令行。
find . -type f |xargs ls -lS |head -20
find . -type f -printf '%s %p\n' |xargs ls -lS |head -20
ls
命令的答案:find . -type f -printf '%k %p\n' |sort -n |tail -n 20
ls
命令上。sort
命令会崩溃。你需要使用自定义代码来仅存储最大的20个项目。使用以下命令获取Linux文件的大小:
du -h <<FileName>>
或者
du -h <<FilePath>>
ls
。xargs
的使用。类似于find . -type f | xargs ls
的结构将无法处理包含空格的子目录或文件名,因为它会在将其传递给ls
之前拆分来自find
的字符串。您可以保护字符串或使用空字符终止的字符串来解决此问题,例如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
的输出是按列排列的,只需打印正确的列即可完成。
awk
的奇妙世界 - 下一站是使用 cat some.csv | awk '{s+=$4} END {print s/NR}'
求平均值。 - Anton Drukhxargs
会将前一个命令的每一行输出作为参数添加到其末尾,因此您的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
find . -type f -printf '%s %p\n'
命令,不要使用xargs
。 - Kenney