Добавление -c paramiko
кому: ansible
Ansible сил для пользований библиотекой Paramiko Python внутренне, какой appearently не должен иметь установленного sshpass. Консультируйтесь с этой закрытой проблемой о системе отслеживания ошибок GitHub Ansible.
EDIT1:
Для ответа на исходный вопрос да, возможно администрировать использование поля Linux Ansible с корневой учетной записью и паролем. Можно было использовать -c paramiko
переключитесь во-первых для копирования pubkey в цель и выполнение еще некоторой начальной загрузки прежде, чем переключиться на использование полноценных Сборников пьес Ansible.
Это довольно просто в Python с os.walk
. Предупреждение, непроверенный код. Я предполагаю, что список имен содержит по одному имени в строке с
#!/usr/bin/python2
import os
names_file = open('names.log')
names = set(line.rstrip('\n') for line in names_file.readlines())
names_file.close()
for root, dirs, files in os.walk('/path/to/top/directory'):
for name in files:
path = os.path.join(root, name)
if os.path.isfile(path):
if name not in names:
print path
#os.remove(path) # uncomment this line if you're happy with the set of files to remove
Если вы будете удовлетворять с Bash
, я хотел бы предложить следующий алгоритм (это может быть реализовано на любых сценарии Lanuage):
Найти / path_to_folder -name "* .jpg" -fprint file.tmp
file.tmp
и name.log
, чем сравнивать его по ] comm -23 files.tmp name.log
file.tmp
в RM
Команда ОБЫЧИТЬСЯ С ПОСТАВИТЕЛЬСТВОМ файлах - в обоих Files.tmp
и name.log
Это может быть одинаковым (полным или относительно одной папки). Имя файла Разделитель для name.log
в этом случае ньролайн
.
find -name '*.jpg' -print0 | grep -zZ -vf name.log | xargs -0 COMMAND
замените COMMAND
на ls -l
и если вам нравится - rm
Edit: Представленная команда рассматривает name.log как набор регенераций. @terdon запомнил tha name.log - это список имен файлов.
Если имена файлов используют обычные "нормальные" символы, этого, вероятно, будет достаточно, но могут возникнуть проблемы, если:
[
, ]
и т.д. (в этом случае может не получиться удалить некоторые файлы и даже удалить некоторые файлы, имя которых находится в name.log
! Чтобы избежать этого мы можем использовать grep -F
или защитить специальную символику в name.log
. a.jpg
совпадут со всеми изображениями, заканчивающимися на "a", например camera.jpg
, banana.jpg
). Для случая 2, для ситуации с префиксами, -- мы можем добавить "/" в начале регенерации.
sed 's!^!/!' name.log > new.log
find -name '*.jpg' -print0 | grep -F -zZ -vf new.log | xargs -0 COMMAND
или даже
find -name '*.jpg' -print0 | grep -zZFvf <(sed 's!^!/!' name.log) | xargs COMMAND
для случая 2, ситуация с суффиксами менее важна, так как файлы изображений имеют расширения.
Чтобы правильно решить эту ситуацию, нужно сказать, что "после имени файла ничего нет": нам нужен регеxp, а специальные символы chars (пример .
[
]
) в именах файлов должны быть защищены.
sed -re 's!([].[])!\\\1!g; s!.*!/&$!' name.log > new.log
find -name '*.jpg' -print0 | grep -zZ -vf new.log | xargs -0 COMMAND
Это действительно легкий w/ pax
. В нем есть понятие опции -s
ubstitution, которая может изменять имена файлов по мере их написания. Также можно указать несколько аргументов -s
ubstitution. И, что наиболее уместно, в данном случае, у выбранных членов есть только такое количество аргументов -s
ubstitution, которое необходимо для успешного выполнения одного совпадения, но любая подстановка, в результате которой имя файла становится нулевым, приводит к тому, что файл совпадения не будет выбрано.
Для демонстрации:
mkdir test; cd test
touch match nomatch
pax -ws '|^.*/match$|&|' -s '|.*||' ./ |
pax -v
Вышеуказанное делает и изменяет в каталог ./test
, создает два файла, затем -w
обновляет архив tar
в трубу w/ pax
, содержимое которой вторым pax
-v
erbosely перечисляет. Вышеуказанное печатается:
-rw-r--r-- 1 mikeserv mikeserv 0 Feb 22 11:40 ./
...потому что ./соответствует
совпадает -v с окончательной подстановкой, которая заменяет все символы в любом имени файла.
А с pax
на самом деле вам не нужно копировать содержимое файла в его архив - вы можете использовать -rwl
, которая является операцией копирования, создающей жесткие связи.
Итак, если ваш файл был назван paxscript
и выглядел как....
cd -- "$1"
pax -rwvl \
-s '|^.*/image1\.jpg$|&|' \
-s '|^.*/photo3\.jpg$|&|' \
-s '|^.*/redcar\.jpg$|&|' \
-s '|^.*/balloon2323\.jpg$|&|' \
-s '|.*||' ./ ../"${1##*/}.mirror"
cd - >/dev/null
... а потом вы прогнали его как...
. ./paxscript "$targetdir"
Он создал бы зеркало "$targetdir"
в своем родительском каталоге, содержащем только жесткие ссылки на имена файлов, которые вы хотите сопоставить. Затем вы можете проверить результаты по своему усмотрению, прежде чем делать rm -rf "$targetdir"
и избавиться только от всех нужных вам патнанов.