Как удалить каталоги без символических ссылок в одной папке

У меня есть эта структура папок:

build.1
build.2
build.3
build.4
current -> symlink to build.4
previous -> symlink to build.3

Я использую Debian, как правильно удалить каждую сборку (= папку), на которую нет символической ссылки?

2 ответа

Как сказал Брон, официального способа сделать это не существует (точнее: его не может быть из-за структуры файловой системы, вы можете использовать только свой собственный). Это было бы так, как я написал бы в bash (при условии, что текущая структура, fgrep слишком мягок, чтобы быть использованным вообще):

# Current list of symlinks (will return build.3 and build.4 in this case)
symed=`ls -1 | xargs -l readlink`;
# Loop over all build directories
for dir in build.*;
do
    # Either it's a known symlink, or we remove it
    fgrep -q $dir <<< $symed || rm -rf $dir;
done

Не очень "правильный" способ, но как часто вы это делаете? Мой обычный подход - запускать небольшой фрагмент Perl (выберите свой собственный яд), который читает содержимое каталога, проверяет символические ссылки и создает список каталогов для удаления.

Там нет метаданных в месте назначения символической ссылки, которая скажет вам, что она связана с.

Вы также захотите позаботиться об условиях гонки - если отдельная задача обновляет символические ссылки, вы не хотите удалять новый каталог до того, как он будет связан!

Другие вопросы по тегам