我已经创建了指向大量日志文件的符号链接。日志文件的语法是yyyymmdd.log.gz
.
为了简化事情,我使用一个简单的序列,而不用以下命令解析它date
:
for dd in $(seq -w 20150101 20151231) ; do
ln -s $origin/$dd.log.gz $target/$dd.log.gz
done
如何一次性删除我刚刚创建的所有损坏的符号链接?
答案1
答案2
find -L /path -type l -exec rm -i {} \;
使用-L
,find
尝试遵循符号链接来评估-type
测试。如果成功跟踪链接,则该链接为不是损坏,并且-type l
测试将是错误的(因为它是针对链接解析的内容进行评估的)。如果无法跟随链接,则链接已损坏并且测试-type l
将为真。
如果-type l
测试成功,则会-exec rm {} \;
删除断开的链接。
建议使用-xtype l
GNUism,主要针对 Linux 用户,并且不适用于非 GNU UNIX 系统,如 Solaris、FreeBSD 等。
答案3
With (您实际上在代码中zsh
使用语法;with ,您需要引用这些变量):zsh
bash
rm -- $target/*(-@)
或者:
rm -- $target/<20150101-20151231>.log.gz(-@)
*(@)
匹配文件类型符号链接。*(-@)
是那些仍然是类型的符号链接符号链接解析后(即无法解析符号链接目标的那些)。这相当于 GNUfind
的-xtype l
.
在zsh
GNU 中ln
,您宁愿将循环编写为:
ln -srt $target -- $origin/<20150101-20151231>.log.gz
即使$origin
包含相对路径(并创建相对符号链接,这也可以降低符号链接被破坏的风险,如果起源(与目标) 以后会更名)。
答案4
如果所有损坏的链接都是由错误命令在给定的时间戳创建的,那么下面的效果很好。
ls -lrt | grep "Sep 17 15:06" | awk '{print $9}' | xargs \rm