如何在特定字符后从 ls 命令的输出中删除空格?

How do I remove spaces from an output of an ls command AFTER a certain character?

这是我的 ls 命令和 post- 处理:

ls -l $pwd | tail -n +2 | cut -c1-10,50-999999  |  sed 's/./& /g'  |
    sed  's/\(.\{7\}\)/&  /g' | sed 's/\(.\{30\}\)/&/g'

这是输出:

- r w x   r - -   r - -     a d d   . o l d   

我想删除文件名中的所有 spaces,所以我可以得到这样的结果:(请记住 space 模式保留在权限中)

- r w x   r - -   r - -     add.old   

你根本不知道。有一大堆文章详细说明了为什么您不应该解析 ls 输出,而是使用工具组合,例如 shell 的(很可能非常全面)文件名通配,find, 和统计

例如:

for name in * ;do echo $(stat -c '%A' "$name"):$name ; done

编辑: stat 给你很多格式来帮助你实现你想要的输出,现在这给你一个明确的输出(仍然,这可以文件名中的换行符等问题),您可以单独在 stat 输出上使用 sed。参见 man stat

如果文件名不够干净,编写防弹代码来解析 ls 输出是很棘手的。需要注意的是你的文件名不能包含换行符并且应该避免其他控制字符(但或多或少其他任何东西都应该没问题)你可以冒险解析 ls 的输出。如果您的文件名仅限于可移植文件名字符集 ([-a-zA-Z0-9_.]),您应该没问题。但请注意,并不是每个人都像您一样严格遵守文件名,因此如果有人创建了包含意外字符的名称,您的脚本可能会突然失败。请注意,文件名中的前导破折号可能会造成严重破坏;例如,--version 之类的名称会使普通 GNU 实用程序出现意外行为。

  • 您已收到警告!

您可以使用 cut -c1-10,50- 来避免输入所有这些 9。您可以在每个表达式前使用 -e 将 3 个 sed 命令合并为一个。

通过一点点 sed 技巧,您可以更轻松地处理间距。在我的 Mac 上,文件名开头的正确列是第 54 列,而不是第 50 列:

$ ls -l |
> sed -e '1d;12q' |     # Only 11 file names listed
> cut -c 1-10,54- |
> sed -e 's/\(.\)\(...\)\(...\)\(...\)/   @@/' \
>     -e h -e 's/@@.*/@@/' -e 's/[^@]/& /g' -e G -e 's/\n//' \
>     -e 's/@@[^@]*@@//'
- r w -   r - -   r - -   2da.c
- r w -   r - -   r - -   3dalloc1.c
- r w -   r - -   r - -   3dalloc2.c
- r w -   r - -   r - -   3dalloc3.c
- r w -   r - -   r - -   3dalloc4.c
- r w -   r - -   r - -   4 @@ Testing
- r w -   r - -   r - -   @@ Testing
d r w x   r - x   r - x   Floppy
d r w x   r - x   r - x   IQ
d r w x   r - x   r - x   Primes
d r w x   r - x   r - x   SHA-256
$

sed 命令有什么作用?

  • 在每组 3 个权限位之后用 space 替换权限字段,并在权限末尾添加 @@
  • 将修改后的行复制到保留位space。
  • @@ 及其后的所有内容替换为 @@
  • 在每个非 @ 字符后添加一个 space。
  • 使用换行符将保留 space 附加到模式 space。
  • 删除换行符。
  • 删除两个 @@ 标记,两者之间的所有内容都不是 @

这使得文件名中的 @@ 标记保持不变 — 见证两个包含 space 的名称,其中包含 @@.

根据记录,传递给 cut 然后 sed 的 11 行是:

-rw-r--r--   1 jleffler  staff     2362 Mar  6 19:48 2da.c
-rw-r--r--   1 jleffler  staff     1638 Mar  6 19:48 3dalloc1.c
-rw-r--r--   1 jleffler  staff     2870 Mar  6 19:48 3dalloc2.c
-rw-r--r--   1 jleffler  staff     2968 Mar  6 19:48 3dalloc3.c
-rw-r--r--   1 jleffler  staff     2096 Mar  6 19:48 3dalloc4.c
-rw-r--r--   1 jleffler  staff        0 Mar 21 16:46 4 @@ Testing
-rw-r--r--   1 jleffler  staff        0 Mar 21 16:47 @@ Testing
drwxr-xr-x   4 jleffler  staff      136 Mar  9 23:03 Floppy
drwxr-xr-x   8 jleffler  staff      272 Mar  6 19:48 IQ
drwxr-xr-x  33 jleffler  staff     1122 Mar  6 19:48 Primes
drwxr-xr-x  13 jleffler  staff      442 Mar  6 19:48 SHA-256