Bash скрипт для удаления удаленных файлов на основе совпадений локальных файлов - PullRequest
0 голосов
/ 03 марта 2020

Вот скрипт bash, который я запускаю локально:

#!/usr/bin/bash

ls some_pattern_*.txt > deletion_list.txt
rm $(cat deletion_list.txt)
rm deletion_list.txt

exit 0

Он ищет файлы, соответствующие определенному шаблону, и выводит этот список файлов в текстовый файл с именем * 1004. *. Затем скрипт удаляет все файлы, указанные в текстовом документе, прежде чем окончательно удалить сам deletion_list.txt. Это может показаться очень запутанным, но у меня есть причина сделать это следующим образом.

Вот немного измененная версия, которую я пытаюсь запустить на удаленном хосте через sftp соединение:

#!/usr/bin/bash

sftp -i ~/.ssh/myprivatekey $username@$host <<-EOF
lcd /home/mydirectory
!ls some_pattern_*.txt > deletion_list.txt
rm $(cat deletion_list.txt)
!rm deletion_list.txt
EOF

exit 0

Что нужно сделать так:

1) Подключиться к удаленному хосту с помощью sftp (ssh на удаленном хосте не включен, в случае, если какие-либо ответы предлагают использовать ssh вместо )

2) Изменить локальный каталог

3) Создать список файлов для удаления из локального каталога, в котором мы находимся, и сохранить deletion_list.txt локально в том же каталоге

4) Удаление файлов с удаленного хоста на основе файлов в deletion_list.txt - удаление происходит удаленно, список файлов для удаления является локальным (deletion_list.txt создается из файлов, которые являются локальными, и затем те же файлы удалено с удаленного хоста).

У меня проблема с шагом 4. Я не знаю, как удалить удаленные файлы, поступающие из локального файла.

РЕДАКТИРОВАТЬ:

Как кто-то указал, cat также не работает во время сеанса SFTP.

Ответы [ 2 ]

3 голосов
/ 03 марта 2020

Когда ssh недоступен, вы не сможете сделать $(cat ...).

Но вы можете создавать команды rm локально и отправлять их на сервер:

find -printf 'rm %f\n' -name 'pattern' | \
   sftp -b - server:`pwd`

ПРИМЕЧАНИЕ: вам, вероятно, понадобится дополнительный слой для обеспечения правильного цитирования (например, что происходит, когда имя файла содержит пробел или символ новой строки?).

0 голосов
/ 03 марта 2020
ssh  $username@$host  "ls -1 | grep -v some_pattern_*.txt |  xargs rm"

https://linux.die.net/man/1/xargs

xargs -> Преобразует входной аргумент конвейера для команды

...