使用纯 find 命令查找链接到特定目录的所有软链接文件

使用纯 find 命令查找链接到特定目录的所有软链接文件

我在 ~、~/PathA (git 目录)和 ~/PathB 中有 2 个链接目录。 ~/PathA 是 ~/PathB 的子目录。这两个链接到其他物理磁盘。我将很多文件链接到 ~/PathA/config/ 下的文件 ~.我想找出所有这些链接文件。显示“xxxxx -> yyyyy”格式。

当我们使用旧/其他机器上的配置文件时,经常使用这种方法。

如果我编写脚本或使用管道,这很容易做到,但有些丑陋。但我想要如果只使用寻找命令我可以做到。

编辑:经过多次测试,我明白了。最重要的地方是-l名称-打印

▶ find ~ -type l ! -path '/home/eexpss/磁盘' ! -path '/home/eexpss/bin' -lname '/home/eexpss/bin/config/*' -printf "%p -> %l\n"
/home/eexpss/.local/share/applications -> /home/eexpss/bin/config/.local+share+applications
/home/eexpss/.local/share/nautilus/scripts -> /home/eexpss/bin/config/.local+share+nautilus+scripts
/home/eexpss/.vimrc -> /home/eexpss/bin/config/fedora.vimrc
/home/eexpss/.proxy.pac -> /home/eexpss/bin/config/.proxy.pac
/home/eexpss/.bash_aliases -> /home/eexpss/bin/config/fedora.bash_aliases
/home/eexpss/.icons -> /home/eexpss/bin/config/.icons/
find: ‘/home/eexpss/磁盘/lost+found’: Permission denied
find: ‘/home/eexpss/磁盘/eexp/.gvfs’: Permission denied
/home/eexpss/.vim -> /home/eexpss/bin/config/.vim
/home/eexpss/.gitconfig -> /home/eexpss/bin/config/.gitconfig

我会接受 Stéphane Chazelas 的回答。谢谢。

答案1

Standardfind无法自行打印有关找到的文件的任何信息(完整路径除外)。不过,有些find实现对此进行了扩展。

例如,对于 GNU find(在大多数通用/传统 GNU/Linux 发行版中都可以找到):

find ~ -type l -printf '%p -> %l\n'

将以您要求的格式打印符号链接,对于递归找到的符号链接(执行身体的遍历,即不跟踪主目录中目录的符号链接)。某些find实现还具有一个谓词,以类似于您可以从中提取信息的-ls格式进行输出。ls -li

如果你想做一个逻辑遍历(遵循目录的符号链接)并打印该信息,您无法find仅通过一次调用来完成此操作(即使使用 GNU find),但您可以使用zshs globbing 来遍历目录,并find仅使用 GNU 来打印信息:

find ~/***/*(D@) -printf '%p -> %l\n'

或者使用任何 shell 和 GNU find(但需要多次调用):

find -L ~ -xtype l -exec sh -c '
  exec find "$@" -printf "%p -> %l\n"' sh {} +

找到符号链接最终指向一些现存的文件~/bin/config(假设 的任何组件~/bin/config本身都不是符号链接),仍然是zsh

find ~/**/*(D@e{'[[ $REPLY:A = ~/bin/config/* ]]'}) -printf '%p -> %l\n'

相关内容