我有一个很大的“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 下可用。