2

我正在尝试将输出格式化ls -la为仅包含在 12 月修改的文件并很好地输出它们,这就是它们目前的样子:

ls -la | awk {'打印 $6,$7,$8,$9,$10'} | grep "十二月" | 排序-r | 头-5
12 月 4 日 20:15 文件夹/
12 月 4 日 19:51 ./
12 月 4 日 17:42 文件夹\约翰/
12月4日 16:19 作业\MAT\ 08/
12 月 4 日 16:05 文件夹\ Smith/

ETC..

如何设置诸如正则表达式之类的内容以不包含诸如“./”和“../”之类的内容,

另外,对于其中包含空格的文件夹,如何省略斜杠“\”。我想把斜线放在最后。这可以通过shell命令实现吗?还是我必须使用 Perl 来修改测试?我确实希望日期和时间保持原样。任何帮助将不胜感激!

盒子有 linux,这是通过 SSH 完成的。

编辑:

这是我到目前为止所拥有的(感谢 Mark 和 gbacon)

ls -laF | grep -vE ' ..?/?$' | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } ' | grep "Dec" | sort -r | head -5

我只是在用空格“”替换“\”时遇到了麻烦。除此之外,感谢到目前为止的所有帮助!

4

7 回答 7

1

这是您的答案之一:

如何设置诸如正则表达式之类的内容以不包含诸如“./”和“../”之类的内容,

使用ls -lA而不是ls -la.

您可以打印出从第 6 列到行尾的所有内容,而不是打印出固定数量的列:

ls -lA | awk '{ for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); } '

我没有得到反斜杠的空格,所以我不知道你为什么会这样。要修复它,您可以添加以下内容:

| sed 's/\\//g'
于 2009-12-05T23:10:15.517 回答
1

检查并确保您的“ls”命令没有别名为其他东西。通常,“原始” ls 不会为您提供 / 目录,也不应该转义空格。

很明显,有些东西正在为您的 awk 打印这些文件而转义空间,因为 awk 往往会用空格分隔字段,这就是 \ 字符的用途。

Spaces 是文件名,专门用于阻止编写简单的脚本和管道混搭,就像您在这里尝试做的那样。

于 2009-12-05T23:12:48.490 回答
1

您可以使用find为您完成大部分工作:

find -mindepth 1 -maxdepth 1 -printf "%Tb %Td %TH:%TM %f\n" | grep "^Dec" | sort -r

默认情况下不包括父目录 (..)。-mindepth 1摆脱当前目录 (.) 。您可以删除-maxdepth 1以使其递归,但您应该将 更改%f%p包含文件名的路径。

这些是 中的字段-printf

  • %Tb - 短月份名称
  • %Td - 一个月中的哪一天
  • %TM:%TM - 小时和分钟
  • %f - 文件名

例如,在grep我为行的开头添加了一个匹配项,因此它不会匹配一个名为“十进制”的文件,该文件在 11 月进行了修改。

于 2009-12-06T02:12:59.453 回答
1

您可以过滤以下输出ls

ls -la | grep -vE ' ..?/?$' | awk {'print $6,$7,$8,$9,$10'} | grep "Dec" | sort -r | head -5

如果您满足于使用 Perl:

ls -la | perl -lane 's/\\ / /g;
                     print "@F[5..9]"
                       if $F[8] !~ m!^..?/?$! &&
                          $F[5] eq "Dec"'
于 2009-12-05T23:18:51.820 回答
1

所有的 greps 和 seds 是怎么回事???

ls -laF | awk '!/\.\.\/$/ && !/\.\/$/ &&/Dec/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n"); }'
于 2009-12-06T04:47:15.030 回答
0

看到带有 awk 和 grep/sed 的管道真的让我很恼火。awk 是一个非常强大的行处理工具。

ls -laF | awk '
    / \.\.?\/$/ {next}
    / Dec / {for (i=1; i<=5; i++) $i = ""; print} 
' | sort -r | head -5
于 2009-12-06T03:20:08.460 回答
0

好吧,您可以删除...添加grep -v "\." | grep -v "\.\."

不确定其余的

于 2009-12-05T23:18:39.263 回答