有没有一种简单的方法可以找到文件路径中没有符号链接的所有文件?
3 回答
您可以使用此脚本:(将整个代码复制/粘贴到shell中)
cat<<'EOF'>sympath
#!/bin/bash
cur="$1"
while [[ $cur ]]; do
cur="${cur%/*}"
if test -L "$cur"; then
echo >&2 "$cur is a symbolic link"
exit 1
fi
done
EOF
${cur%/*}
是一个bash参数扩展
例子
chmod +x sympath
./sympath /tmp/foo/bar/base
/tmp/foo/bar is a symbolic link
我不知道任何简单的方法,但这是一个完全回答您的问题的答案,使用两种方法(实际上,本质上是相同的):
使用辅助脚本
创建一个名为hasnosymlinkinname
(或选择更好的名称 --- 我一直不喜欢选择名称)的文件:
#!/bin/bash
name=$1
if [[ "$1" = /* ]]; then
name="$(pwd)/$1"
else
name=$1
fi
IFS=/ read -r -a namearray <<< "$name"
for ((i=0;i<${#namearray[@]}; ++i)); do
IFS=/ read name <<< "${namearray[*]:0:i+1}"
[[ -L "$name" ]] && exit 1
done
exit 0
然后chmod +x hasnosymlinkinname
。然后使用find
:
find /path/where/stuff/is -exec ./hasnosymlinkinname {} \; -print
脚本的工作方式如下:使用IFS
技巧,我们将文件名分解为路径的每个部分(由 分隔/
)并将每个部分放入一个数组namearray
中。然后,我们循环遍历数组的(累积)部分(通过/
一些IFS
技巧加入),如果这部分是符号链接(参见-L
测试),我们以不成功的返回码 ( 1
) 退出,否则,我们以成功返回码 ( 0
) 退出。
然后find
将此脚本运行到/path/where/stuff/is
. 如果脚本以成功返回码退出,文件的名称将被打印出来(但-print
你可以做任何你喜欢的事情)。
使用 one(!)-liner(如果您有大屏幕)给您的祖母(或您的狗)留下深刻印象
find /path/where/stuff/is -exec bash -c 'if [[ "$0" = /* ]]; then name=$0; else name="$(pwd)/$0"; fi; IFS=/ read -r -a namearray <<< "$name"; for ((i=0;i<${#namearray[@]}; ++i)); do IFS=/ read name <<< "${namearray[*]:0:i+1}"; [[ -L "$name" ]] && exit 1; done; exit 0' {} \; -print
笔记
对于可能出现在文件名中的空格或有趣符号,此方法是 100% 安全的。我不知道您将如何使用此命令的输出,但请确保您将使用一种对文件名中可能出现的空格和有趣符号也安全的好方法,即不要t 用另一个脚本解析它的输出,除非你使用-print0
或类似的聪明的东西。
短的:
find myRootDir -type f -print
这将回答这个问题。
注意不要在指定目录的末尾添加斜杠( not myRootDir/
but myRootDir
)。
除了真实路径中的真实文件之外,这不会打印。符号链接目录中没有符号链接文件或文件。
但...
如果你想确保指定的目录包含符号链接,有一个小 bash 函数可以完成这项工作:
isPurePath() {
if [ -d "$1" ];then
while [ ! -L "$1" ] && [ ${#1} -gt 0 ] ;do
set -- "${1%/*}"
if [ "${1%/*}" == "$1" ] ;then
[ ! -L "$1" ] && return
set -- ''
fi
done
fi
false
}
if isPurePath /usr/share/texmf/dvips/xcolor ;then echo yes; else echo no;fi
yes
if isPurePath /usr/share/texmf/doc/pgf ;then echo yes; else echo no;fi
no
因此,您可以在运行此命令时查找文件路径中没有符号链接的所有文件:
isPurePath myRootDir && find myRootDir -type f -print
因此,如果打印了某些内容,则没有符号链接部分!