【问题标题】:how to list files in Unix without the modified date如何在没有修改日期的情况下在 Unix 中列出文件
【发布时间】:2013-03-15 10:48:38
【问题描述】:

我正在尝试创建一个 zip 文件,该文件将在多个服务器上运行以比较服务器的内容。由于许多原因,我比较的最简单和最好的信息是目录列表的文本文件......但我需要没有修改日期,因为它们使比较显示在这种情况下无关紧要的差异。

因此,如果我运行命令 ls -la 来创建文本输出以进行比较,我会得到如下结果:

drwxr-xr-x.  6 root   root       4096 Mar 20 14:59 .
dr-xr-xr-x. 22 root   root       4096 Feb 18 03:20 ..
drwxr-xr-x.  9  web   ad         4096 Oct 30 14:35 apache-tomcat-6.0.18
drwxr-xr-x.  9  web   ad         4096 Mar 24 03:00 apache-tomcat-6.0.36
lrwxrwxrwx.  1 root   root          5 Oct 30 14:06 java -> java6
lrwxrwxrwx.  1 root   root         16 Oct 30 14:05 java6 -> jdk/jdk1.6.0_37/
lrwxrwxrwx.  1 root   root         16 Mar 20 14:59 java7 -> jdk/jdk1.7.0_17/
drwxr-xr-x.  4 root   root       4096 Mar 20 15:02 jdk
lrwxrwxrwx.  1 root   root         21 Nov  6 15:09 tomcat -> apache-tomcat-6.0.36/

我想要使用的是ls -la | cut -c 1-31,但它只需要一个列表(字符 1-31),我真的想要日期之后的数据。我对 Unix 还很陌生,想知道是否有人知道如何生成一个看起来像这样的列表:

drwxr-xr-x.  6 root   root       4096 .
dr-xr-xr-x. 22 root   root       4096 ..
drwxr-xr-x.  9  web   ad         4096 apache-tomcat-6.0.18
drwxr-xr-x.  9  web   ad         4096 apache-tomcat-6.0.36
lrwxrwxrwx.  1 root   root          5 java -> java6
lrwxrwxrwx.  1 root   root         16 java6 -> jdk/jdk1.6.0_37/
lrwxrwxrwx.  1 root   root         16 java7 -> jdk/jdk1.7.0_17/
drwxr-xr-x.  4 root   root       4096 jdk
lrwxrwxrwx.  1 root   root         21 tomcat -> apache-tomcat-6.0.36/

谢谢

【问题讨论】:

  • 您可以过滤ls 的输出,但这可能不可靠,因为ls 的输出并不是真正设计为机器可读的。如果你有 GNU find-printf 选项可以让你有选择地以你喜欢的任何格式打印信息。

标签: unix ls


【解决方案1】:

cut 让我们指定范围,more easily than awk
将它与tr -s ' ' 结合使用以修剪重复的空格。

$ ls -la /etc/ |tr -s ' ' |cut -d' ' -f1,2,3,4,5,9-
drwxr-xr-x 2 root root 4096 opt
lrwxrwxrwx 1 root root 21 os-release -> ../usr/lib/os-release
-rw-r--r-- 1 root root 6920 overlayroot.conf
drwxr-xr-x 4 root root 4096 vmware-tools
lrwxrwxrwx 1 root root 23 vtrgb -> /etc/alternatives/vtrgb

这很有用,例如当使用并行 shell 并且您想要检查在不同时间创建的多个主机上的文件时。

【讨论】:

    【解决方案2】:

    发布替代解决方案,因为已接受的解决方案将在文件名带有空格时失败。

    在 Linux 和其他支持它的系统(不是 Mac OS)上使用 --time-style 和 null 格式

    [root@preg junk]# ls -lah
    total 12K
    drwxr-xr-x 2 root root 4.0K Jan  6 16:12 .
    drwxr-xr-x 4 root root 4.0K Jan  6 15:38 ..
    -rw-r--r-- 1 root root    0 Jan  6 12:42 '$#%bad'
    -rw-r--r-- 1 root root    2 Jan  6 16:12 'moar bad;'
    -rw-r--r-- 1 root root    0 Jan  6 12:40 'quote"file'
    -rw-r--r-- 1 root root    0 Jan  6 12:41 'single'\''quote'\''file'
    
    [root@preg junk]# ls -lah  --time-style='+'  .
    total 12K
    drwxr-xr-x 2 root root 4.0K  .
    drwxr-xr-x 4 root root 4.0K  ..
    -rw-r--r-- 1 root root    0  '$#%bad'
    -rw-r--r-- 1 root root    2  'moar bad;'
    -rw-r--r-- 1 root root    0  'quote"file'
    -rw-r--r-- 1 root root    0  'single'\''quote'\''file'
    [root@preg junk]# 
    

    【讨论】:

      【解决方案3】:

      我认为解决您的问题的最佳方法是使用 awk。

      ls -la | awk '{print $1, $2, $3, $4, $5, $9}'
      

      所以你得到这样的输出:

      drwxr-xr-x. 6 root root 4096 .
      dr-xr-xr-x. 22 root root 4096 ..
      drwx------+ 5 user staff 170 Desktop
      drwx------+ 16 user staff 544 Documents
      drwx------+ 6 user staff 204 Downloads
      

      【讨论】:

      • 这很好用!谢谢。我一直都知道我需要将我的知识扩展到 awk。谢谢。
      • 不幸的是,这将在名称中包含空格的文件上失败,例如“moar bad;” -- ls -ld moar\ bad\; | awk '{print $1, $2, $3, $4, $5, $9}' -rw-r--r-- 1 root root 2 moar 另一种可能的解决方案: ls -ld --time-style='+' 。使用空格式的时间样式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多