标题我的含糊不清。这是我要问的一个例子。
#ls -l
打印出类似这样的内容
-rw-r--r-- 1 root root 5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root 5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root 5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root 5122 2011-10-08 19:38 5111.txt
假设我想使用grep查找包含'511'
的所有文件名,并打印出文件的大小/文件名。
如何grep文件名'511'
,仍然打印文件大小,而不是输出包含前两行。
非常感谢你,阅读手册并没有帮助我。
答案 0 :(得分:3)
您可以使用awk
:
pax:~$ echo '
-rw-r--r-- 1 root root 5110 2011-10-08 19:36 test.txt
-rw-r--r-- 1 root root 5111 2011-10-08 19:38 test.txt
-rw-r--r-- 1 root root 5121 2011-10-08 19:36 5110.txt
-rw-r--r-- 1 root root 5122 2011-10-08 19:38 5111.txt
' | awk '{if (substr($8,1,3)=="511"){print $5" "$8}}'
5121 5110.txt
5122 5111.txt
它只是检查字段8(文件名)以查看它是否以“511”开头,如果是,则打印出字段5和8,大小和名称。
答案 1 :(得分:2)
find . -name '*511*' -printf "%s\t%p\n"
答案 2 :(得分:1)
如果它只是您要过滤的文件名,为什么首先列出其他文件?
ls -l *511* | cut -c23-30,48-
或甚至与awk
;
ls -l *511* | awk '{ $1 = $2 = $3 = $4 = $6 = $7 = ""; print }'
但是,ls
的输出并不完全可靠,因此您应该避免直接处理它。
perl -le 'for (@ARGV) { print ((stat($_))[7], " $_") }' *511*
stat()
系统调用以机器可读格式返回ls
显示的原始信息。任何可以访问此信息的工具都可以;它不一定是Perl。
答案 3 :(得分:0)
您可以绕过ls
并使用bash
的文件名glob
:
for f in 511*
do
echo $f $(stat --format '%s' $f)
done