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 显示文件名,即使它碰巧与单个匹配文件一起运行。
小智 22
或者,更简单:
ls -l | grep -v ^l
Run Code Online (Sandbox Code Playgroud)
解释
ls -l意味着以长形式列出。执行此操作时,第一个字符串提供有关每个文件的信息。第一个字符表示每个文件的类型。如果是符号链接,则 anl是第一个字符。
grep -v ^l表示过滤掉 ( -v) 以 ( ^) an开头的行l。
从 2.12 版开始,-rGNU grep的选项不会取消引用符号链接,除非您手动指定它们:
-r, --recursive
递归读取每个目录下的所有文件,仅当它们位于命令行上时才遵循符号链接。这等效于 -d 递归选项。
-R, --dereference-recursive
递归读取每个目录下的所有文件。与 -r 不同,遵循所有符号链接。
在 zsh 中,由于glob 限定符,这很容易:
grep -- PATTERN **/*(.)
Run Code Online (Sandbox Code Playgroud)
该模式**/递归地遍历子目录。glob 限定符.将匹配限制为常规文件。
如果没有 zsh,请使用find(参见Michael Horner 的回答)。在这种特殊情况下,GNU grep 可以做你想做的事情(这正是它grep -r所做的)——但只有从 2.12 版开始,早期版本才遵循符号链接。