我正在修改ls
命令的输出。我已经实现了我想要的所有代码,但我觉得它可以在很多方面得到很多改进,所以我想问你对它的意见。我会解释每个命令,所以你一定知道我想用它做什么。
以下是我的长行代码:
ls -l |
sed 's/total/ C FILES.c/' |
cut -b 45-100 |
grep -e "\.c" |
sed 's/C FILES.C/\nC FILES\n/' |
sed 's/[0-9]//' |
sed 's/[0-9]//' |
sed 's/[0-9]//'
ls -l
显示“total:”+一个数字,然后每行显示1个文件。
sed 's/total/' C FILES.c/
这个很长的部分应该用标题替换“total”行,正如你将在下一个命令中看到的那样,我不得不这样缩进,所以它在与ls -r
显示的文件名相同的行。数字将在后一个命令中处理。
cut -b 45-100
会删除文件名前的所有内容。正如我在最后一个命令中在“C FILES.C”之前放置了45个空格,它将剪切它们并仅显示55个下一个字符。 (55足够大,可以包含我使用的任何文件名。)
grep -e "\.c"
删除不以.c结尾的文件。由于标题C FILES不是c文件,我必须使用.c后缀编写它,因此在使用grep命令时它不会消失。
sed 's/C FILES.C/\nC FILES\n/'
删除.c后缀并添加一些换行符以分隔命令行,标题和文件列表。
第二个命令被“C FILES”标题替换为“total”。但它没有取代“总数”之后的数字,所以这个数字仍在这里,我想摆脱它。该命令不知道它必须删除的是什么号码,它可以是1,45甚至666.我使用命令sed 's/[0-9]//
的3次删除3到0到9之间的数字(如果有的话)一个,否则它什么都不做)。如果数字的长度高于3,仍然会有一些数字,但我认为我总共不会超过999,所以重复3次这个命令就足够了。我尝试了's/[0-9][0-9][0-9]//
,但只有在数字的长度至少为3时才有效。否则,它什么也没做。
这是我能做的最好的事情。我试图在没有选项的情况下使用ls
命令,但之后没有以下命令运行良好,我不知道如何输出标题,因为没有要替换的行。
欢迎任何关于如何让它更好更容易阅读的想法或建议。
答案 0 :(得分:1)
如果不知道您的确切预期输出(请提供),我的感觉是您可以用以下内容替换所有内容:
echo C FILES; ls -1 *.c
对我而言:
C FILES
foo.c
norm.c
readfile.c
size.c
thr.c
这是您正在寻找的输出吗?如果没有,那是什么?
答案 1 :(得分:0)
我觉得我会做的事情看起来你做的事情感觉相当简单但据我所知,你想简单地列出标题为“C Files”的c文件?
如果我是对的,为什么不做这样的事情:
echo "C Files" && ls *.c
如果你想要一个更“管道”的格式:
ls *.c | cat <(echo "C Files") -
然后可以将第二个变体以完全相同的格式发送到文件:
ls *.c | cat <(echo "C Files") - > output.txt
要获得相同的输出但重新排序命令输入:
cat <(echo "C Files") <<< cat <(ls *.c)