查找文件路径的任何部分都不是符号链接的所有文件

时间:2012-12-16 09:33:52

标签: linux shell symlink

是否有一种简单的方法可以找到文件路径中没有符号链接的所有文件?

3 个答案:

答案 0 :(得分:0)

您可以使用以下脚本:(将整个代码复制/粘贴到

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 parameter expansion

示例

chmod +x sympath
./sympath /tmp/foo/bar/base
/tmp/foo/bar is a symbolic link

答案 1 :(得分:0)

我不知道任何简单的方式,但这里有一个完全回答你的问题的答案,使用两种方法(事实上,基本上是相同的):

使用辅助脚本

创建一个名为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,您可以执行任何其他操作)。

使用一个(!) - 衬垫(如果你有一个大屏幕)来打动你的祖母(或你的狗)

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%安全的。我不知道你将如何使用这个命令的输出,但请确保你将使用一个好的方法,对于可能出现在文件名中的空格和有趣的符号也是安全的,即'don'除非你使用-print0或类似的智能东西,否则用另一个脚本解析它的输出。

答案 2 :(得分:0)

短:

find myRootDir -type f -print

这将回答这个问题。

小心不要在指定目录的末尾添加斜杠(不是myRootDir/而是myRootDir)。

除真实路径中的实际文件外,不会打印。 没有符号链接的文件,也没有符号链接目录中的文件。

但是...

如果你想确保指定的dir包含一个符号链接,那么就有一个litte 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

因此,如果打印了某些内容,就没有符号链接部分!