Назад | Перейти на главную страницу

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

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

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

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

Как сказал Брон, официального способа сделать это не существует (более строго: его не может быть из-за конструкции файловой системы, вы можете использовать только свой собственный). Вот так я бы написал его в 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 (выберите свой собственный яд), который прочитает содержимое каталога, проверит символические ссылки и построит список каталогов для удаления.

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

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