@linqu

Perl — как найти символические ссылки?

Нужно в каталоге найти все символические ссылки, которые ссылаются на файлы или каталоги в по указанному пути.
Я полный профан в Perl, как это сделать на этом языке - представления не имею. На bash все элементарно:
find_dir=/home/someuser/Desktop
to_dir=/tmp/someuser/tmpmounts
ls -la ${find_dir} | awk '\$11 ~ \"${to_dir}\" {print ${find_dir}/\$9}' | xargs rm

Но правки нужно внести в проект на Perl'e, поэтому нужен код на perl
  • Вопрос задан
  • 36 просмотров
Решения вопроса 1
Аналогичный код-пример на perl
#!/usr/bin/perl

$find_dir = '.';
$to_dir = '/tmp/test';

foreach(glob("$find_dir/*"))
{
        print "checking $_ \n";
        $link_path = readlink($_);
        if($link_path ne '')
        {
                print "..found symlink $link_path \n";
                if($link_path =~ /^$to_dir/)
                {
                        print "....found matched symlink!\n";
                        # do something ...
                        # for example delete found file
                        # unlink($link_path)
                }
        }
}

На тестовой папке с содержимым
drwxrwxr-x 2 dt dt 4096 сен 16 12:08  1
lrwxrwxrwx 1 dt dt    4 сен 16 12:18  2 -> /tmp
lrwxrwxrwx 1 dt dt    9 сен 16 12:18  3 -> /tmp/test
lrwxrwxrwx 1 dt dt   18 сен 16 12:19  4 -> /tmp/test/test.txt
lrwxrwxrwx 1 dt dt   29 сен 16 12:19  5 -> '/tmp/test/tes test test 2.txt'
lrwxrwxrwx 1 dt dt   29 сен 16 12:19 'tes test test 2.txt' -> '/tmp/test/tes test test 2.txt'
-rwxr-xr-x 1 dt dt  387 сен 16 12:22  test.pl
Выдает следующее:
checking ./1 
checking ./2 
..found symlink /tmp 
checking ./3 
..found symlink /tmp/test 
....found matched symlink!
checking ./4 
..found symlink /tmp/test/test.txt 
....found matched symlink!
checking ./5 
..found symlink /tmp/test/tes test test 2.txt 
....found matched symlink!
checking ./tes test test 2.txt 
..found symlink /tmp/test/tes test test 2.txt 
....found matched symlink!
checking ./test.pl
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@pcdesign
Вот такой однострочник, чтобы найти в папке /tmp симлинки

perl -E 'for $f (glob "/tmp/*") {say $f if (-l $f)}'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы