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


10

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

因此,我为每个类别的文档创建了(几个)其他目录。例如,我有一个“图像”目录,该目录具有指向“ 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

不是一个完整的答案,但是您可以将a的结果保存find /myfiles -type f到文件中,然后使用find /images -type l -exec readlink {} \; | egrep myfiles来获得符号链接的文件列表,/images然后遍历结果sed对每个文件进行a操作,以删除保存的第一个文件中的路径,因为它们已经存在有符号链接,剩下的文件是没有符号链接的文件。
布拉奇利,2015年

2
是否可以改用硬链接,所以可以使用硬链接计数器来查看是否有链接?使用,ls -l您可以在第二列中看到硬链接数。
Lambert

按照@Lambert的话做。rm这些符号链接目录,pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dir例如,仅使用那些与您的jpg匹配的文件,就可以通过程序更改文件名来获取硬链接。基于变化几次都是配料等-你可以得到很多更重要的是出来的
mikeserv

Answers:


6

如果我正确理解了这个问题,则需要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 /目录中有指向该文件的符号链接,则使用此方法会有一个警告,该文件将不会报告缺少符号链接的情况。


谢谢 !是的,您确实理解正确。接近但不太完全。我的错不是你的:-)我给出的示例显示了一个简单的myfiles目录。实际上,myfiles下的图像文件可以位于任意级别的嵌套目录中。
罗伯特·亚历山大

我编辑了答案以搜索整个myfile,但是请检查这是否是您想要的。
taliezin

那里几乎是:-)当文件中有空格(可能还有其他废话,例如单撇号)时,您的脚本就会打...……
罗伯·亚历山大

我认为现在应该没问题
taliezin 2015年

您最后的修改是在每个字母n出现时将每个f拆分!:-)我将IFS线连接到IFS =,然后从键盘换行,然后再换一个新线。 “
罗伯特·亚历山大

3

我假设下面的文件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下可用。


我本来打算发布类似您的comm命令的内容,但是现在我不会再看到您已经这样做了。但是,从重定向是sort没有意义的。那么流程替换将不会输出任何内容。另外,/images如果您要查找/myfiles除符号之外的其他目录中没有符号链接的文件,则可以在旁边添加许多目录/images
三胞胎

1
请参阅stackoverflow.com/questions/7665/…,以了解readlink -f
Tripleee 2015年

@tripleee,我在构建流程重定向版本时忘记了进行重定向,谢谢。是的,您可以轻松添加其他目录或进行其他更改。
吉尔斯(Gillles)“所以-不要再邪恶了”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.