Хорошо, во-первых, 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
Единственное различие, которое я вижу, - это звездочка во втором случае.
С помощью GNU find
вы можете сделать следующее:
find -L / -xtype l -prune -samefile foo -exec ls -ld {} +
Это позволит найти все файлы типа symlinks, которые в конечном итоге разрешаются в тот же файл, что и foo
. Это также будет включать симлинки на симлинки или жесткие ссылки на foo
1.
С -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
stat
не считает симлинки, но считает хардлинки - если это поможет.