研究 Linux 版 powershell,却找到了 Linux 的 bug?

2019-03-20 11:24:07 +08:00
 ps1aniuge
------- [环境] -------
虚拟机,centos 7.6
kernel 升级到了最新 kernel.x86_64.0.3.10.0-957.10.1.el7
find 版本最新 findutils-4.5.11-6.el7.x86_64

QQ 群号=183173532
名称=powershell 交流群
群内创作文章,著作权所有者为群

------- [问题从这里开始] -------
我想,用 powershell 统计,系统最大的 10 个文件。


------- [ linux 的 powershell 命令 1,返回的结果] -------
PS /root> Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 |Select-Object {$_.length / 1mb},fullname

$_.length / 1mb FullName
--------------- --------
134217726.007812 /proc/kcore
101.161056518555 /usr/lib/locale/locale-archive
77.8723373413086 /usr/bin/dockerd-ce
65.3838729858398 /usr/bin/docker
63.01171875 /var/lib/rpm/Packages
51.1564149856567 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
42.2908325195312 /usr/bin/containerd
29.62109375 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
28.40234375 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
27.015625 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [ linux 的 powershell 命令 2,返回的结果] -------
du -sh (Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 ).fullname
0 /proc/kcore
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll


我的想法:
咦?怎么变 0 了?我还是用 [正宗 linux 命令] 试试吧。


------- [ linux 的 find 命令 1,返回的结果] -------
find / -type f -exec du -sh {} + | sort -rh | head -n 10
du: 无法访问"/proc/3933/task/3933/fdinfo/6": 没有那个文件或目录
du: 无法访问"/proc/3933/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 2,返回的结果] -------
find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 10
du: 无法访问"/proc/4157/task/4157/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 3,返回的结果] -------
find / -type f -ls | sort -k 7 -r -n | head -10 | column -t | awk '{print $7,$11}'
find: ‘/proc/4267/task/4267/fdinfo/6 ’: 没有那个文件或目录
find: ‘/proc/4267/fdinfo/5 ’: 没有那个文件或目录
140737486266368 /proc/kcore
106075056 /usr/lib/locale/locale-archive
81655064 /usr/bin/dockerd-ce
68559960 /usr/bin/docker
66072576 /var/lib/rpm/Packages
53641389 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
44345152 /usr/bin/containerd
31059968 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29782016 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28327936 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [我的疑问] -------

问 1:linux 上所有都是文件么?
是的话,find,du 为什么会报那些错?谁来答答?



问 2:/proc/kcore 是文件么?
测试代码:
root@centos76 ~]#ls -l
-r--------. 1 root root 140737486266368 3 月 20 10:57 /proc/kcore



问:find 不加 [-print0 ] 参数后,能算 [最大 10 个文件] 么?
答:不行。
欢迎帮忙测试,下面的命令:
find / -type f | xargs -0 du -h | sort -rh | head -n 10

find / -type f | xargs du -h | sort -rh | head -n 10




问:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?
测试代码:
[root@centos76 ~]# find /proc -name 'kc*' -type f
/proc/kcore

/proc/kcore[root@centos76 ~]# find /proc -name 'kc*' -type f -print0
返回空,即无返回



问: [ find / -type f -exec du -sh {}] 也有丢文件的 bug,对么?
答:
应该是 du 的问题。

测试代码:
find /proc -name 'kc*' -type f
/proc/kcore

find /proc -name 'kc*' -type f -exec du -sh {} +
0 /proc/kcore




------- [结论] -------
我认为:
[ linux 的 powershell 命令 1,返回的结果]
[ linux 的 find 命令 3,返回的结果]
靠谱点。
虽然 [/proc/kcore ] 返回的结果我并不需要。

当然,我也认为,没占磁盘,du 不应该返回。

powershell 那两个返回都是可以的,find 的返回就不乐观了。
7113 次点击
所在节点    Linux
51 条回复
LokiSharp
2019-03-20 14:10:41 +08:00
@ps1aniuge #18 ps 的 tab 自动补全很弱智 get-i + tab 一下显示的 是 Get-IseSnippet 如果 get- +tab 不知道要 tab 多少次
alfredsun
2019-03-20 14:18:07 +08:00
我先 block 为敬
cs8425
2019-03-20 15:18:24 +08:00
问:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?

查一下每个指令的参数意义再问问题好吗?
`-print0`不是没有输出, 导到文件或是其他程式转一下就知了
指令: `find /proc -name 'kc*' -type f -print0 | base64 -`
输出: `L3Byb2Mva2NvcmUA`
不要动不动就喊 bug= =


参考:
https://superuser.com/questions/118639/whats-the-usage-of-exec-xargs-and-print0

http://blog.sina.com.cn/s/blog_5611597901019nye.html
ps1aniuge
2019-03-20 16:13:52 +08:00
@LokiSharp 重名的太多,没法子呀,linux 也一样。
bash 补全=bash 一手好牌打的稀烂,最终结果还得去学 ps。


@CallMeReznov 任何媒体,都有禁止内容,都要有监管。fb 也封杀几十万账户。也是土大王。毒枭也禁止手下马仔碰 du,有自由么?
你再嚷嚷,群规还是那样(宗教群宗旨):“群是正规 ps 社区,不是 ps 黑社会。不是 ps 贼窝。禁止学用 ps 作恶,禁止 ps 黑客,禁止提问,分享,黑客技术”,我不觉得有问题。

ps 是我心爱的东西,我不想社区脏了。可以吗?


凡是游戏,就要封杀外挂,大家怎么看?
凡是多人游戏,中国开挂最多,外国人都想封杀国区,大家怎么看?

脚本小子,大义凛然,阵阵有词,大家怎么看?
从 winxp,到 win10,收紧权限,大家怎么看?

堕落的人多否? win 中脚本小子多否?教旨好否?欢迎探讨。
LokiSharp
2019-03-20 16:15:15 +08:00
@ps1aniuge #24 bash tab 两下能把匹配的列出来,所以问题不大
MaxTan
2019-03-20 16:18:03 +08:00
这么说楼主真的是"传教士“么
catalina
2019-03-20 16:22:06 +08:00
@ps1aniuge 你貌似认为网络安全就是黑客技术?那抱歉,在下告辞
ps1aniuge
2019-03-20 16:33:11 +08:00
@cs8425
[root@centos76 ~]# find /proc -name 'keys' -type f
/proc/keys
[root@centos76 ~]# find /proc -name 'keys' -type f -print0
返回空。
hi 我不认同 要 base64 的做法,还认为这是 刁民 /刁钻 的做法。或者说 此参数有,未知的大坑。
CallMeReznov
2019-03-20 16:51:52 +08:00
@ps1aniuge 哈哈哈 说的好高大上,奇葩到底还是奇葩
从安全防护=黑客 这种奇葩思想是只有你一个人拥有的,不但思想奇葩甚至连正常的是非对错都无法分辨,把这种错误的思维和强加到你所谓"大义"上只是你自嗨罢了.还好意思举例子.理讲都讲不通



原来就感觉这人偏执的很思维也很奇怪,现在发现脑子也不正常.
这里不是你那 QQ 群一亩三分地,把人禁言了没人反你,少把你那套东西搞到这里
自己搞不懂的东西就是 BUG?不符合自己心仪的就是错误的做法?
多去学学吧!要么就滚回你那一亩三分地
jaylee77
2019-03-20 17:02:37 +08:00
https://www.v2ex.com/t/545357#reply38

这哥们真挺逗的,哈哈哈哈
ps1aniuge
2019-03-20 18:31:02 +08:00
我建了一个 linux 群,教人 linux 命令语法,要求人尊重分享者,要求。跪拜 linux 大神“脱袜子”

@CallMeReznov 跑进来不好好学命令语法,总想研究拿肉鸡,用人机子挖矿,总想在群里吸血,不愿分享。总想保留朝 linux 大神“脱袜子”吐痰的权利。这就是你。谁喜欢你,就把你这孙子带走。
Ultraman
2019-03-20 18:53:50 +08:00
人身攻击就没意思了。。。
cs8425
2019-03-20 18:59:33 +08:00
@ps1aniuge #28
所以你还是没查`-print0`代表的意思????
就告诉你不用换行改成'\0'分隔档名
自己看清楚下完指令后下一行`[root@centos76 ~]#`前面有没有东西吧
自己不看说明, 不看清楚输出, 就怪别人有坑?!!
刁民到底是谁啊 Zzz
cs8425
2019-03-20 19:09:26 +08:00
#33
再补充一下
终端没显示不代表没输出
印出不可见字元也是输出
base64/hexdump 转一下就知道有没有东西
连验证都不会
还要怪别人有坑= =
CallMeReznov
2019-03-20 19:27:59 +08:00
呵呵,又脑补全世界都是"黑客小子,脚本小子"了.
V2 不能像 QQ 群里那样让你封人,不能封上人嘴喷人家好急吧?
无能狂怒形容你真很贴切.


30 楼哥们发的那帖子,这种智商和文化水平还有脸皮去讨论别的问题,先救救你的专业水平吧
哈哈
masker
2019-03-20 19:30:48 +08:00
顽固不化?
ps1aniuge
2019-03-20 20:27:11 +08:00
@cs8425 有啊,但是没用啊。
不换行的话,,行不行,我不知道。但我知道 kcore 丢了。感觉应该是不行。
find / -type f -print0 | xargs -0 du -h 这个你试过么? -print0 输出的不换行,应该用 -0 就可以接收吧。
去掉-print0 -0 也不行,不去也不行。所以我的结论才是 bug。

你的结论是什么呢? 是“去掉也不行,不去也不行,也不是 bug,就是不能这么用” 对么?
zjqzxc
2019-03-20 20:38:51 +08:00
竟然没人喷“群内创作文章,著作权所有者为群”这句话?
ps1aniuge
2019-03-20 20:39:04 +08:00
@jaylee77 你哈哈 个 啥?
人没理想 跟咸鱼有啥区别?
人不思考 跟木头有啥区别?
思考,类比,讨论有何不好?你哈哈 个 啥?说出你的笑点,看看哈不哈?



@CallMeReznov 上蹿下跳,看给你美的,群学习讨论氛围太差? 有你给此本贴带来了屎一样的氛围差么?没你的群学习氛围很好。
liubaicai
2019-03-20 20:41:57 +08:00
欢乐多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/546510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX