linux - 删除目录中的所有文件而不删除符号链接(symbolic link)及其指向的文件

标签 linux hyperlink find rm

在特定目录中,我希望能够保存符号链接(symbolic link)及其指向的文件,同时删除其余部分。

示例:/home/me/test_dir ls

我的链接 文件1.txt 文件2.txt 文件3.txt

随着时间的推移,“mylink”指向 file1.txt,然后指向 file2.txt,现在指向 file3.txt

mylink ->/home/me/test_dir/file3.txt

我可以执行哪行命令来仅删除 file1.txt 和 file2.txt?我有大约 800K 个文件需要删除。

谢谢。

最佳答案

这是一个脚本,如果目录中没有指向常规文件的符号链接(symbolic link),则该脚本会从该目录中删除常规文件。

#!/usr/bin/perl
# Usage: perl rmlinks.pl DIRECTORY

use warnings;
use strict;
use autodie;
use Cwd qw/abs_path/;

my $dirname = shift;
opendir(my $dir, $dirname);
chdir $dirname;
my %referenced;

while (my $file = readdir $dir) {
  $referenced{abs_path(readlink $file)} = 1 if -l $file;
}

rewinddir $dir;
while (my $file = readdir $dir) {
  unlink $file if -f $file && ! -l $file && !exists $referenced{abs_path $file};
}

closedir $dir;

它尝试考虑绝对和相对符号链接(symbolic link)路径,但使用风险由您自行承担。

关于linux - 删除目录中的所有文件而不删除符号链接(symbolic link)及其指向的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51415312/

相关文章:

linux - Bash脚本帮助,包含处理文件的子目录

linux - 如何以尽可能少的步骤设置所有文件夹和所有文件的权限 CHMOD

javascript - 如何在浏览器窗口中关闭当前选项卡?

html - 链接到 Shiny 应用程序的选项卡或面板

c++ - 套接字和多线程

jquery - 使菜单在重定向到其他页面后保留其 css 属性

string - 在字符串中查找字符串的所有实例

Linux 将文件重命名为 dirname

c++ - vector 字符串字符替换在字符串中间 C++

linux - 无法在@INC 中找到 Cairo.pm