-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 для отдельных файлов.