Список каталогов, которые не являются целью символьной ссылки

#bash #directory

#bash #каталог

Вопрос:

Использование оболочки Bash.

У меня есть каталог с большим количеством подкаталогов.

Символические ссылки указывают на некоторые из них. Это делает управление содержимым довольно удобным, поскольку символические ссылки имеют более выразительные имена, чем имена каталогов.

Для некоторых других каталогов это задание перенаправления все еще не завершено.

Есть ли способ Bash перечислить каталоги, которые не являются целью символьной ссылки (содержатся в той же родительской папке, если это упрощает дело)? Для меня это вернет каталоги, над которыми мне еще предстоит поработать, и избавит от некоторой подверженной ошибкам ослиной работы.

Комментарии:

1.В качестве отправной точки вам нужно знать, что у целевого файла или каталога нет списка его ссылок. Файловая система содержит информацию о ссылке, но не ссылку. Таким образом, вам придется воссоздать эту недостающую информацию, собрав все отношение (1,1) мощности к мощности, заполнив новую (1,n) таблицу отношения мощности из (destination-path, source-path)

2. Вообще говоря, символическая ссылка — это просто путь к цели, а цель ничего не знает о символических ссылках. Если вы знаете расположение целевых объектов / ссылок, то что-то вроде join -v1 <(ls LOCATIONTARGETS | sort) <(ls LOCATIONLINKS | xargs readlink | sort) должно выполнить эту работу.

Ответ №1:

Для решения требуется GNU CoreUtils:

 #!/usr/bin/env sh

{
  # Create a list of null delimited symbolic links destination
  find . -type l -printf ./%l\0

  # Append directories to the null delimited list
  find . -type d -print0
} |

# Sort the null delimited list
sort -z |

# Extract unique entries (those having no symbolic link)
uniq -zu |

# Produce a human-readable list by replacing null delimiters by newlines
xargs -0l
  

Комментарии:

1. Зачем нужно нулевое завершение? Это решение обрабатывает многострочные имена файлов?

2. @Amessihel Да, он обрабатывает имена с символами новой строки или другими непечатаемыми символами. Поскольку он уже использует команду CoreUtils find со своим -printf аргументом, он предполагает, что другие команды CoreUtils с поддержкой null доступны и используют ее.

3. Это дополнительно выведет цели символических ссылок в текущем каталоге, указывающие за пределы этого каталога. Также будут исключены только ссылки, которые были созданы относительно точно из этого текущего каталога. В остальных случаях будут выведены как каталог, так и цель, не относящаяся к here.

4. @thanasisp Я знаю эти ограничения, но спасибо, что указали на это. Я написал более раннее решение, используя промежуточный шаг xargs -0 realpath -z --relative-to=. | sed -z 's_^_./_' , который исправил бы не относительные ссылки в качестве относительного назначения. Я думал, что добавленная сложность превысила, казалось бы, простой контекст poster, в то же время обрабатывая только один крайний случай с не относительными символическими ссылками, но не ссылками на другую ветку.