如何在Shell脚本中合并ls与cksum命令的输出结果
可行的实现方法
方法一:遍历单个文件拼接输出
用for循环逐个处理文件,对每个文件分别获取ls -lrt和cksum的结果,再拼接成一行:
for file in *; do # 只处理普通文件,跳过目录、链接等 [ -f "$file" ] && echo "$(ls -lrt -- "$file") $(cksum -- "$file")" done
--用来兼容文件名带空格、连字符开头的情况,避免命令解析出错[ -f "$file" ]确保只处理普通文件,如果你需要包含其他类型(比如目录),可以去掉这个判断或者换成[ -e "$file" ]
方法二:包含隐藏文件的版本
如果需要处理当前目录下的隐藏文件(比如.bashrc),可以调整循环范围,同时排除.和..这两个特殊目录:
for file in .* *; do [ -f "$file" ] && [ "$file" != "." ] && [ "$file" != ".." ] && echo "$(ls -lrt -- "$file") $(cksum -- "$file")" done
原命令失败的原因
你之前的(ls -l; cksum ls) | xargs逻辑有问题:
- 括号里的命令是先执行
ls -l输出所有文件的长列表,再执行cksumls``(这里的ls会生成当前目录的文件名列表,cksum一次性处理所有文件,输出每个文件的校验行) - 最终输出是
ls的所有行在前,cksum的所有行在后,是两段独立的内容,xargs只能把这些内容当成一堆参数处理,没法实现你要的“每行ls信息+对应cksum信息”的合并效果
内容的提问来源于stack exchange,提问作者92rwf0lXXW4m
相关产品推荐
相关产品推荐

