ls 忽略符号链接的目录内容

The*_*eer 23 ls symlink recursive

我有一个目录,我想在其中列出所有内容(文件和子目录)而不显示符号链接。我在 Linux 上使用 GNU 实用程序。该ls版本是8.13。

例子:

完整目录列表:

~/test$ ls -Gg
total 12
drwxrwxr-x 2 4096 Jul  9 10:29 dir1
drwxrwxr-x 2 4096 Jul  9 10:29 dir2
drwxrwxr-x 2 4096 Jul  9 10:29 dir3
-rw-rw-r-- 1    0 Jul  9 10:29 file1
-rw-rw-r-- 1    0 Jul  9 10:29 file2
lrwxrwxrwx 1    5 Jul  9 10:29 link1 -> link1
lrwxrwxrwx 1    5 Jul  9 10:30 link2 -> link2
Run Code Online (Sandbox Code Playgroud)

我想得到什么

~/test$ ls -somthing (or bash hack)
total 12
dir1 dir2 dir3 file1 file2
Run Code Online (Sandbox Code Playgroud)

注意:我的主要动机是在不遵循符号链接的情况下执行递归 grep(GNU grep 2.10)。

Mic*_*mer 33

对于上述问题,您可以使用find

find . -mindepth 1 ! -type l
Run Code Online (Sandbox Code Playgroud)

将列出当前目录或任何不是符号链接的子目录中的所有文件和目录。

mindepth 1只是跳过.当前目录条目。它的核心是 的组合-type l,表示“是一个符号链接”,和!,表示否定以下测试。它们组合起来匹配每个不是符号链接的文件。这将递归列出所有文件和目录,但没有符号链接。

如果您只想要常规文件(而不是目录):

find . -type f
Run Code Online (Sandbox Code Playgroud)

仅包含此目录的直接子级,而不是递归地包含所有其他子级:

find . -mindepth 1 -maxdepth 1
Run Code Online (Sandbox Code Playgroud)

您可以将这些(和其他)测试组合在一起以获得所需的文件列表。

grep对与您正在使用的测试匹配的每个文件执行特定操作,请使用-exec

find . -type f -exec grep -H 'some pattern' '{}' +
Run Code Online (Sandbox Code Playgroud)

'{}'将这些文件被替换。该+告知需要find你的命令完成。该选项-H强制 grep 显示文件名,即使它碰巧与单个匹配文件一起运行。

  • 使用 [`grep -H`](http://unixhelp.ed.ac.uk/CGI/man-cgi?grep),如果你有的话(见 `man grep`),否则使用 `grep 'pat' ' {}' /dev/null ';'` 欺骗它认为有多个文件,如果你不这样做。 (2认同)

小智 22

或者,更简单:

ls -l | grep -v ^l
Run Code Online (Sandbox Code Playgroud)

解释

ls -l意味着以长形式列出。执行此操作时,第一个字符串提供有关每个文件的信息。第一个字符表示每个文件的类型。如果是符号链接,则 anl是第一个字符。

grep -v ^l表示过滤掉 ( -v) 以 ( ^) an开头的行l


tij*_*agi 8

从 2.12 版开始,-rGNU grep的选项不会取消引用符号链接,除非您手动指定它们:

-r, --recursive

递归读取每个目录下的所有文件,仅当它们位于命令行上时才遵循符号链接。这等效于 -d 递归选项。

-R, --dereference-recursive

递归读取每个目录下的所有文件。与 -r 不同,遵循所有符号链接。


Gil*_*il' 5

在 zsh 中,由于glob 限定符,这很容易:

grep -- PATTERN **/*(.)
Run Code Online (Sandbox Code Playgroud)

该模式**/递归地遍历子目录。glob 限定符.将匹配限制为常规文件。

如果没有 zsh,请使用find(参见Michael Horner 的回答)。在这种特殊情况下,GNU grep 可以做你想做的事情(这正是它grep -r所做的)——但只有从 2.12 版开始,早期版本才遵循符号链接。