我在 ~、~/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
),但您可以使用zsh
s 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'