Вот функционирование, уборщик реализация вашей логики:
for FILE in *; do
if ssh [email protected]_serverip test -e "$FILE"; then
# write code here
fi
done
(. Там не будет путь к файлам, когда код составлен таким образом, так что вам не нужно basename
) test -e "$FILE"
будет молча выходить из 0 (true), если файл существует, и 1 (false), если файл отсутствует, хотя ssh
также выйдет с ошибочным кодом, если соединение завершится с ошибкой.
Однако, это очень дорогой способ решить вашу проблему. Он не сработает, если в вашем текущем каталоге слишком много файлов, и он запускает ssh
один раз для каждого файла.
Вы лучше получить список удаленных файлов, а затем проверить против него:
#!/bin/sh
if [ "$1" != "--xargs" ]; then # this is an internal flag
(
ssh [email protected]_serverip find . -maxdepth 1 # remote file list
find . -maxdepth 1 # local file list
) |awk '++seen[$0]==2' |xargs -d "\n" sh "$0" --xargs # keep duplicates
else
shift # remove the --xargs marker
for FILE in "[email protected]"; do
# write code here using "$FILE" (with quotes)
done
fi
Это делает две вещи. Во-первых, поскольку внутренний --xargs
не указан при запуске скрипта, он подключается к удаленному серверу и получает список всех файлов в домашнем каталоге. Они будут перечислены, например, как ./.bashrc
. Затем тот же список создается локально, и результаты передаются в awk
.
Команда awk
создает ассоциативный массив (хэш) из каждого элемента, который он видит, увеличивая его, а затем проверяя общее число против числа два. Он печатает второй экземпляр любой строки, которую он видит. Затем они передаются по адресу xargs
, которому поручено использовать \n
(разрыв строки) в качестве разделителя, а не любого символа пробела.
Примечание: этот код сломается, если у вас есть файлы с разрывом строки в их имени. Не делай этого.
xargs
затем рекурсивно вызывает этот скрипт, в результате чего возникает предложение else
, и мы прокручиваем каждый файл. Если у вас слишком много файлов, имейте в виду, что может быть несколько экземпляров этого скрипта (см. man xargs
).
Этот код требует GNU xargs
. Если вы находитесь в BSD или какой-либо другой системе, которая не поддерживает xargs -d "\n"
, вы можете использовать perl -pe 's/\n/\0/' |xargs -0
.