如何列出不存在符号链接的文件?

如何列出不存在符号链接的文件?

我有一个很大的“myfiles”目录,里面装满了各种文档,并且不想修改其结构。

因此,我为每一类文档创建了(几个)其他目录。例如,我有一个“images”目录,其中包含指向“myfiles”目录中每个文件的符号链接,以及每个符号链接的其他描述性文件(具有相同的文件名)以及描述和其他元数据.jpg.cr2/images 目录中的符号链接可能与原始链接文件具有不同的名称。

我试图找到最简单的方法来确保“myfiles”目录中的每个图像文件都有一个到“images”目录的符号链接。

查看文件夹结构的示例

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

应该结果

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

答案1

如果我正确理解了这个问题,你需要 myfiles 中的文件,这些文件在图像中没有符号链接:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

如果您在目录 myfiles/1 中有文件 a.jpg 并且在目录 images/3 或仅在 images/ 中有指向该文件的符号链接,则此方法有一个警告,则不会报告文件缺少符号链接。

答案2

我假设下面的文件myfiles不是符号链接,并且所有文件名都不包含换行符。 (如果违反这些假设,我的方法仍然可以工作,但会变得更加复杂。)我还假设您有通用readlink实用程序,并且它支持-f规范化路径,Linux 上就是这种情况(GNU 和 BusyBox),但不是在例如 OSX 上。

构建一个文件列表,并对其进行排序以便更好地衡量:

find /myfiles -type f -print | sort >all.list

使用绝对路径构建符号链接目标列表。

find /images -type f -exec readlink -f {} \; | sort >linked.list

列出未链接的文件:

comm -32 all.list linked.list

如果您使用支持进程替换的 shell,则可以将其全部放在一个命令中:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

如果下面的链接/images是绝对的,则可以readlink不使用该-f选项,该选项在 *BSD 和 OSX 下可用。

相关内容