Команда Bash для проверки наличия файла не работает, хотя имя файла совпадает - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующий скрипт для подключения к SFTP-серверу и удаления файла, если он соответствует имени. Но хотя файл с соответствующим именем находится на сервере, сценарий не может перейти в блок проверки -f и, следовательно, не удаляет файл. Что я здесь не так делаю? Ниже мой сценарий.

readarray partners < fileName.txt

for i in "${partners[@]}"
do
  file=`echo "ls" | sftp -i myKey myUser@myIP:${i} | grep "_Name_file_20181024"`
  echo $i
  echo $file

  if [[ -f $file ]]; then
    echo "********"
    delete=`echo "rm $file" | sftp -i myKey myUser@myIP:${i}`
    echo "********"
    echo $delete
  fi


done

Я запускаю это на своем Mac. Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

-f проверяет, существует ли файл на вашем компьютере .
Я полагаю, вы можете проверить, является ли строка файла непустой:

if [ -n "$file" ]; then

Но проверка результата grep была бы более желательной:

if echo "ls" | sftp -i myKey "myUser@myIP:$i" | grep -q "_Name_file_20181024"; then

Остатки:

  • backticks `устарели. Используйте $( ... ) для подстановки команд, которая допускает вложение (и более читабельно).
  • Всегда указывайте свои переменные. Что если в имени файла есть пробелы?
  • sftp это просто ssh, но только передача файла.
  • Не анализировать ls вывод. Это плохо. ls для хорошего форматированного вывода.

Я бы сделал это так, за один проход:

<fileName.txt xargs ssh -i myKey "myUser@myIP" rm -v -f

xargs преобразует каждую строку из fileName.txt в качестве отдельного аргумента. В качестве альтернативы вы можете readarray partners < fileName.txt и ssh .... rm -v -f "${partners[@]}", если у вас нет xargs. ssh будет запущен один раз (таким образом, это будет очень быстро). Если вы просто проверяете, существует ли файл, а затем удаляете его, зачем вообще проверять, является ли конечный результат несуществующим файлом? Параметр -f сделает rm не ошибочным, если удаленный файл не существует, и -v напечатает, если файл был удален (таким образом, вы будете знать, какие файлы были удалены).

Или, если вам нужно sftp, возможно, это сработает:

echo "rm -v -f $(<fileName.txt xargs printf "%q ")" |
sftp -i myKey myUser@myIP

но я не уверен насчет специальных символов в именах файлов, поэтому я думаю, что для этого понадобится немного подправить.

Если вы хотите отфильтровать из списка несуществующие файлы, я бы сделал:

<fileName.txt ssh -i myKey "myUser@myIP" 'while IFS= read -r file; do [ -f "$file" ] && echo "$file"; done' 

т. Часть while IFS= read -r выполняется удаленно, поэтому файлы проверяются на наличие на удаленном сервере. Быстрее выполнить одно соединение ssh для всей работы, затем выполнить отдельные соединения ssh для отдельных файлов.

0 голосов
/ 06 ноября 2018

Знаете ли вы, что оператор if ищет файл на вашем Mac, а не на сервере?

Возможно, вы хотите проверить, пустая ли переменная файла? if [[ -f "$file" ]]; then

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...