Найдите поврежденные символьные ссылки с Python

как насчет проверки версии Python, которую вы используете в первую очередь.

import six
if six.PY2:
    import ConfigParser as configparser
else:
    import configparser
22
задан Ray 17 December 2013 в 12:43
поделиться

5 ответов

Общее высказывание Python состоит в том, что легче спросить прощение, чем разрешение. В то время как я не поклонник этого оператора в реальной жизни, он действительно применяется в большом количестве случаев. Обычно Вы хотите избежать кода, что цепочки два системных вызова на том же файле, потому что Вы никогда не знаете то, что произойдет с файлом, промежуточным Ваши два вызова в Вашем коде.

А типичная ошибка состоит в том, чтобы записать что-то как :

if os.path.exists(path):
    os.unlink(path)

второй вызов (os.unlink) может перестать работать, если что-то еще удалило его после Вашего, если тест, повысьте Исключение и остальную часть остановки Вашей функции от выполнения. (Вы могли бы думать, что этого не происходит в реальной жизни, но мы просто ловили другую ошибку как этот из нашей кодовой базы на прошлой неделе - и это был вид ошибки, которая оставила несколько программистов, царапающих их голову и требующих 'Heisenbug' в течение последних нескольких месяцев)

Так, в Вашем особом случае, я, вероятно, сделаю:

try:
    os.stat(path)
except OSError, e:
    if e.errno == errno.ENOENT:
        print 'path %s does not exist or is a broken symlink' % path
    else:
        raise e

раздражение здесь - то, что статистика возвращает тот же код ошибки для символьной ссылки, которая просто не является там и поврежденная символьная ссылка.

Так, я предполагаю, что у Вас нет выбора, чем повредить атомарность и сделать что-то как

if not os.path.exists(os.readlink(path)):
    print 'path %s is a broken symlink' % path
25
ответ дан slayton 29 November 2019 в 04:02
поделиться

os.lstat () может быть полезным. Если lstat () успешно выполняется и статистика () сбои, то это - вероятно, неработающая ссылка.

12
ответ дан esmit 29 November 2019 в 04:02
поделиться

Я могу упомянуть, что тестировал на hardlinks без Python?/bin/test имеет условие FILE1-ef FILE2, которое верно, когда файлы совместно используют inode.

Поэтому что-то как find . -type f -exec test \{} -ef /path/to/file \; -print работы для тестирования жесткой ссылки в определенный файл.

, Который приносит мне к чтению man test и упоминания о -L и -h, который и работают над одним файлом и возвращают true, если тот файл является символьной ссылкой, однако который не говорит Вам, если цель отсутствует.

я действительно находил, что head -0 FILE1 возвратит код выхода 0, если файл может быть открыт и 1, если он не может, который в случае символьной ссылки на регулярный файл работает тестом для того, является ли это целью, может быть считан.

4
ответ дан dlamblin 29 November 2019 в 04:02
поделиться

os.path

можно попытаться использовать realpath () для получения то, на что символьная ссылка указывает на, затем пытаясь определить, является ли это использование правильного файла, файл.

(я не в состоянии испытать это в данный момент, таким образом, необходимо будет играть вокруг с ним и видеть то, что Вы получаете)

2
ответ дан Jason Baker 29 November 2019 в 04:02
поделиться

Я не парень Python, но это похоже на os.readlink ()? Логика, которую я использовал бы в жемчуге, должна использовать readlink (), чтобы найти, что цель и статистика использования () тестируют, чтобы видеть, существует ли цель.

Редактирование: Я строчил некоторый жемчуг, это демонстрирует readlink. Я верю статистике и readlink perl и os.stat Python (), и os.readlink () являются оба обертками для системных вызовов, таким образом, это должно перевести разумный хорошо как код подтверждения концепции:

wembley 0 /home/jj33/swap > cat p
my $f = shift;

while (my $l = readlink($f)) {
  print "$f -> $l\n";
  $f = $l;
}

if (!-e $f) {
  print "$f doesn't exist\n";
}
wembley 0 /home/jj33/swap > ls -l | grep ^l
lrwxrwxrwx    1 jj33  users          17 Aug 21 14:30 link -> non-existant-file
lrwxrwxrwx    1 root     users          31 Oct 10  2007 mm -> ../systems/mm/20071009-rewrite//
lrwxrwxrwx    1 jj33  users           2 Aug 21 14:34 mmm -> mm/
wembley 0 /home/jj33/swap > perl p mm
mm -> ../systems/mm/20071009-rewrite/
wembley 0 /home/jj33/swap > perl p mmm
mmm -> mm
mm -> ../systems/mm/20071009-rewrite/
wembley 0 /home/jj33/swap > perl p link
link -> non-existant-file
non-existant-file doesn't exist
wembley 0 /home/jj33/swap >
1
ответ дан jj33 29 November 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: