Если ваш find
поддерживает -lname
или-ilname
(расширения GNU, которые также поддерживаются некоторыми BSD (, включая macOS , которые, согласно вашему /Volumes
, вы можете использовать )).
find. -lname '*Dropbox*' -exec ls -ld {} +
Или дело -бесчувственно:
find. -ilname '*dropbox*' -exec ls -ld {} +
Если нет (или даже если да, если вы хотите легко что-то сделать с этими ссылками или предпочитаете отсортированный список )и у вас есть zsh
(, поставляемый по умолчанию в macOS ), вы можете сделать:
zmodload zsh/stat
set -o extendedglob # for (#i) for case insensitive
link_match() {
local target
zstat -A target +link -- "${2-$REPLY}" &&
[[ $target = $~1 ]]
}
ls -ld -- **/*(D@e:'link_match "(#i)*dropbox*"':)
Или воссоздать ссылки:
zmodload zsh/stat
for l (**/*(D@))
zstat -A target +link -- $l &&
[[ $target = *"Dropbox (Personal)"* ]] &&
rm -f -- $l &&
ln -s -- ${target//" (Personal)"} $l
Заметьте, что при необходимости любой шелл-код всегда можно записать в одну строку, но я не вижу в этом смысла. Здесь просто соедините эти строки вместе, если хотите, чтобы они были в одной строке.
Сделать что-то подобное с bash
и утилитами GNU или FreeBSD/macOS сложнее и будет менее эффективно:
LC_ALL=C find. -lname '*Dropbox (Personal)*' -exec bash -c '
for l do
target=$(readlink "$l" && echo.) || continue
target=${target%??}
rm -f "$l" &&
ln -s -- "${target//" (Personal)"}" "$l"
done' bash {} +
Обычно вы используете printf
для вывода данных переменных, например:
#!/bin/sh
src=192.168.1.1
port=22
printf '%s,%s\n' "$src" "$port"
#!
-вверху. Я выбрал /bin/sh
оболочку (оболочку POSIX ), так как в вашем существующем коде нет ничего, что требовало бы другой конкретной оболочки, такой как bash
или zsh
(, см. также Какой интерпретатор оболочки запускает сценарий с нет шебанга?). =
(см. Пробелы в присваиваниях переменных в сценариях оболочки). printf
в качестве меры предосторожности, так как не знаю, могут ли ваши данные в конечном итоге поступить из какого-либо внешнего источника, а echo
известен тем, что иногда возникают проблемы с некоторыми конкретными строками. (см. Почему printf лучше, чем echo?). Вам также может показаться интересным следующее, касающееся цитирования:
Как вариант,
#!/bin/sh
src=192.168.1.1
port=22
string="$src,$port"
printf '%s\n' "$string"
Единственная разница здесь в том, что я создал новую переменную с разделенными запятыми -значениями двух первых переменных, а затем вывел ее. Это может быть то, что вы хотите, в зависимости от того, как вы будете использовать эту строку позже в сценарии.
Чтобы отобразить любое количество переменных, просто укажите их в одной и той же команде echo
. Также обратите внимание, что в правильном синтаксисе оболочки для присваиваний не должно быть пробелов вокруг =
.
#!/bin/sh
SRC="192.168.1.1"
PORT="22"
echo "$SRC,$PORT"
Результатом запуска скрипта будет:
$./test.sh
192.168.1.1,22