проверить, есть ли ссылка из текущего файла

Хорошо, во-первых, tr работает по одному символу за раз, он не может заменить , на a \ | (от одного до двух символов). Поэтому вместо этого используйте sed : sed -e 's /, / \\ | /'

Два, вы можете объединить grep и sed s, похоже, это работает на Bash с GNU sed:

$ LST=$(sed -n '/^LST *=/ {s/^LST *= *//; s/, */\\|/g; p}' config.ini)
$ echo "$LST"
fr\|de\|pl\|ru\|ch\|us\|uk\|ca

(Это в основном говорит: во всех строках, соответствующих / ^ LST * = / , выполните действия в фигурных скобках: два ] s ubstitutions и p rint the line.)

В-третьих, с вашим tr , вы должны заменить запятые на обратную косую черту или вертикальную черту, в зависимости от того, цитируется ли работает или нет, т.е.

$ echo "fr,de,pl" | tr , "\|" 
fr|de|pl
$ echo "fr,de,pl" | tr , '\\|'
fr\de\pl

Но вы этого не сделали, у вас ничего не было взамен. Я не могу воспроизвести это с помощью Bash, но этот синтаксис set выглядит как csh , и я получаю странное поведение с tcsh . В некоторых случаях. Не все.

Хорошо:

$ tcsh
> echo "fr,de,pl" | sed 's/,/\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/,/\\|/'`
> printf "%s\n" "$LST"
fr\|de,pl

Не очень хорошо:

$ tcsh 
> echo "fr,de,pl" | sed 's/, */\\|/'
fr\|de,pl
> set LST = `echo "fr,de,pl" | sed 's/, */\\|/'`
> printf "%s\n" "$LST"
fr|de,pl

Единственное различие, которое я вижу, - это звездочка во втором случае.

2
14.06.2016, 17:28
2 ответа

С помощью GNU find вы можете сделать следующее:

find -L /  -xtype l -prune -samefile foo -exec ls -ld {} +

Это позволит найти все файлы типа symlinks, которые в конечном итоге разрешаются в тот же файл, что и foo. Это также будет включать симлинки на симлинки или жесткие ссылки на foo1.

С -L следуют симлинки. Мы хотим, чтобы найти файлы, связанные с foo, но мы не хотим следовать симлинкам при спуске по дереву каталогов. Отсюда -prune, который останавливает спуск по симлинкам.

С помощью zsh вы можете сделать:

ls -ld /**/*(@De:'[[ $REPLY -ef foo ]]':)

Если вас интересуют только симлинки.


1 Поиск только файлов, которые являются симлинками на foo, будет более сложным. В -samefile/-ef сравниваются номера устройства и inode, возвращаемые системным вызовом stat(), то есть после того, как все симлинки были разрешены (системой). Вы хотите проверить ссылки, каталог цели которых совпадает с каталогом foo, а базовое имя foo.

С помощью zsh это будет:

zmodload zsh/zstat
links_to_thefile() {
  local file link
  file=${1-$REPLY}
  zstat -L -A link +link -- $file || return
  [[ $link:t = $thefile:t ]] || return
  case $link in
    (/*) file=$link;;
    (*)  file=$file:h/$link
  esac
  [[ $file:h -ef $thefile:h ]]
}

thefile=foo
ls -ld /**/*(@D+links_to_thefile)

Или с помощью инструментов GNU (find и shell (bash)):

find / -type l  \( -lname foo -o -lname '*/foo' \) -printf '%p\0%l\0' |
  while IFS= read -rd '' file && IFS= read -rd '' link; do
    [[ $link = /* ]] || link=${file%/*}/$link
    [[ ${link%/*} -ef . ]] && printf '%s\n' "$file"
  done
3
27.01.2020, 22:04

stat не считает симлинки, но считает хардлинки - если это поможет.

Нет способа решить то, о чем вы спрашиваете.

0
27.01.2020, 22:04

Теги

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