2016-06-09 2 views
0

У меня есть pseduocode ниже и хотелось бы знать, будет ли он работать/является лучшим методом для решения проблемы, прежде чем я начну разрабатывать код.Shell scipt: найдите, существует ли имя файла или нет в определенном каталоге на другом сервере

Мне нужно динамически искать через каталог на одном сервере и выяснить, существует ли он на другом сервере или нет. Путь будет другим, поэтому я использую basename и сохраняю его как временную переменную.

for $FILE in $CURRENT_DIRECTORY 
$TEMP=$(basename "$FILE") 

if [ssh [email protected]_serverip find . -name '$TEMP']; then 
//write code here 
fi 

ли это if утверждение возвращает истину, если файл существует на другом сервере?

ответ

2

Вот функционирование, уборщик реализация вашей логики:

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.

1

Это верно, если ssh успешно завершает работу. Вы попробовали замену и разбор команды find?

Смежные вопросы