如何在 ls -Al 中仅输出文件名(带空格)?

Ale*_*ern 116 linux command-line ls

我应该只用这种结构回显文件或目录的名称:

ls -Al | while read string
do
...
done
Run Code Online (Sandbox Code Playgroud)

ls -Al 输出 :

drwxr-xr-x  12 s162103  studs         12 march 28 12:49 personal domain
drwxr-xr-x   2 s162103  studs          3 march 28 22:32 public_html
drwxr-xr-x   7 s162103  studs          8 march 28 13:59 WebApplication1
Run Code Online (Sandbox Code Playgroud)

例如,如果我尝试:

ls -Al | while read string
do
echo "$string" | awk '{print $9}
done
Run Code Online (Sandbox Code Playgroud)

然后只输出没有空格的文件和目录。如果文件或目录有“个人域”之类的空格,则只有“个人”一词。

我需要非常简单的解决方案。也许有比 awk 更好的解决方案。

ter*_*don 139

真的不应该解析ls. 如果这是家庭作业并且你被要求这样做,你的教授不知道他们在说什么。你为什么不做这样的事情:

好的...

find ./  -printf "%f\n"
Run Code Online (Sandbox Code Playgroud)

或者

for n in *; do printf '%s\n' "$n"; done
Run Code Online (Sandbox Code Playgroud)

……坏……

如果你真的很想使用ls,你可以通过做这样的事情来使它更健壮一点:

ls -lA | awk -F':[0-9]* ' '/:/{print $2}'
Run Code Online (Sandbox Code Playgroud)

...和丑陋的

如果您坚持以错误的、危险的方式进行操作并且只需要使用while循环,请执行以下操作:

ls -Al | while IFS= read -r string; do echo "$string" | 
    awk -F':[0-9]* ' '/:/{print $2}'; done
Run Code Online (Sandbox Code Playgroud)

说真的,只是不要。

  • 好吧。我们这里有一个 [XY 问题](http://meta.stackexchange.com/q/66377/203101)。`ls` 并不是获得所需内容的最佳方式。你为什么不发布一个新问题来解释你想要收集的信息,我们可以建议这样做的方法。或者,您可以按原样使用脚本,并使用上述建议之一仅打印名称。但说真的,不要解析 `ls`,只需在新问题中准确地告诉我们你想做什么。 (3认同)
  • @AlexZern 嗯,这就是你不解析“ls”输出的原因之一。 (2认同)
  • @AlexZern 为什么你仍然需要 `-l` 开关?如果你想要的只是文件名,只需运行`ls -A`。使用 `-l` 只会让你的生活更艰难,因为你现在必须解析输出。 (2认同)

bah*_*mat 131

有什么原因ls -A1* 不起作用吗?

例如:

$ touch file1 file2 file\ with\ spaces
$ ls -Al
total 0
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file1
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file2
-rw-r--r-- 1 bahamat bahamat 0 Mar 30 22:31 file with spaces
$ ls -A1
file1
file2
file with spaces
$
Run Code Online (Sandbox Code Playgroud)

* 注意:这是一个大写字母 A 和数字 1。

  • 最干净的解决方案。谢谢 (4认同)
  • 关于“ls -A1”,我发现它非常有用。谢谢你! (3认同)

小智 80

我想知道为什么没有人提到这个简单的命令:

ls -a | sort
Run Code Online (Sandbox Code Playgroud)

  • 它在这里工作是因为当 `ls` 的输出没有进入终端时,它会恢复为 `ls -1`(单列输出)(并禁用不可打印的字符引用/替换;@Kusalananda,你的 `ls` 不是 POSIX如果它仍然符合要求)。`ls` 输出已经排序。因此,将其通过管道传递给 `sort` 充其量什么也不做,更糟糕的是会破坏输出(如果文件名包含换行符)或对非文本文件名失败。`ls -a | cat` 会更好。或者更好的 `ls -A1` 已经提到过(并且因为您通常确实希望在终端上显示时进行替换/引用) (6认同)
  • 杰出的!知道管道到`sort` 是如何导致多列块不旋转成单列的吗? (2认同)
  • @StéphaneChazelas 指出。当输出不是终端时,“ls”的行为有所不同。 (2认同)

Sté*_*las 5

您无法解析 的输出ls,更不用说ls -l因为换行了,就像空格与文件名中的任何字符一样有效。此外,您还需要考虑具有类似... foo -> bar.

-l如果您只想要文件名,为什么还要使用?

做就是了:

for file in *; do
  ...
done
Run Code Online (Sandbox Code Playgroud)

如果要包含点文件(除了...),取决于外壳:

zsh

for file in *(ND); do
  ...
done
Run Code Online (Sandbox Code Playgroud)

bash

shopt -s nullglob dotglob
for file in *; do
  ...
done
Run Code Online (Sandbox Code Playgroud)

ksh93

FIGNORE='@(.|..)'
for file in ~(N)*; do
  ...
done
Run Code Online (Sandbox Code Playgroud)

POSIXly:

for file in .[!.]* ..?* *; do
  [ -e "$file" ] || [ -L "$file" ] || continue
  ...
done
Run Code Online (Sandbox Code Playgroud)