所以基本上,我试图用以下代码打印出一个人类可读的文件和目录大小列表(没有列出当前目录)
du -arh | sort -nr | tail -n +2 | awk -F"./" '{print $1 $2 $3}' | head -n $NUM
NUM变量只是列出的项目数量的参数。
没有awk delimiter命令的上述输出是
4.0K ./url-list
4.0K ./testurl.sh
4.0K ./diskhogger.sh
4.0K ./backup/url-list
4.0K ./backup.sh
但是,添加awk命令输出
4.0K url-list
4.0K testurl.sh
4.0K diskhogger.sh
4.0K backuurl-list
4.0K backup.sh
只要有一个值得注意的子目录,就会出现类似的输出。
./ Library / Cache - LibrarCache等
要清楚,我试图删除" ./"在文件名的开头,不影响其他正斜杠。我的首选输出是:
4.0K url-list
4.0K testurl.sh
4.0K diskhogger.sh
4.0K备份/网址列表
4.0K backup.sh
其中" backup / url-list"没有受到影响。
是'。'在我的分界符中,我不知道一个特殊的角色?如果不是,这到底发生了什么?
我是shell的新手,所以关于此的任何信息都会很棒。
谢谢!
为了清晰而编辑。
答案 0 :(得分:2)
如果您使用的是awk
du -arh | sort -nr | awk -v len="$NUM" 'NR>1{gsub("\\.\\/",""); print} NR==len{exit}'
或只是使用
... | sed 's_\./__' | head ...
答案 1 :(得分:1)
-F"./"
- 被视为"任何字符后跟正斜杠" 。
它被视为正则表达式模式{{1意味着"任何角色"在正则表达式方面。
要使用" dot后跟斜杠" .
作为分隔符,请使用以下方法之一:
./
.
awk -F"[.]/" '{print $1,$2,$3}'
已转义
.
答案 2 :(得分:1)
是。 awk将分隔符视为正则表达式。一个 ”。”在正则表达式中匹配任何字符。因此,awk会在“/”前面的字符处分割你的行。 如果你想匹配文字“。”,最简单的方法是把它放在方括号中,使它成为一个字符类,只匹配字符“。”
你最终得到了
du -arh | sort -nr | tail -n +2 | awk -F"[.]/" '{print $1 $2}' | head -n $NUM
但请注意,这不是您唯一的问题。如果您有一个名称以“。”结尾的目录。并且该目录包含文件,在“du”的结果中的某些行上将有多个“./”条目。 (例如,名为“foo。”的目录中名为“bar”的文件为您提供“foo./bar”。)因此,更好的解决方案是使用awk中的sub()函数替换“./”的第一个实例。用“”。
du -arh | sort -nr | tail -n +2 | awk '{sub("./",""); print}' | head -n $NUM