Сценарий для удаления файлов, которые не соответствуют определенным именам файлов

Добавление -c paramiko кому: ansible -m ping -u root -k Ansible сил для пользований библиотекой Paramiko Python внутренне, какой appearently не должен иметь установленного sshpass. Консультируйтесь с этой закрытой проблемой о системе отслеживания ошибок GitHub Ansible.

EDIT1:

Для ответа на исходный вопрос да, возможно администрировать использование поля Linux Ansible с корневой учетной записью и паролем. Можно было использовать -c paramiko переключитесь во-первых для копирования pubkey в цель и выполнение еще некоторой начальной загрузки прежде, чем переключиться на использование полноценных Сборников пьес Ansible.

2
22.02.2015, 17:44
4 ответа

Это довольно просто в 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
3
27.01.2020, 22:05

Если вы будете удовлетворять с Bash , я хотел бы предложить следующий алгоритм (это может быть реализовано на любых сценарии Lanuage):

  1. Список сборки нынешние файлы: Найти / path_to_folder -name "* .jpg" -fprint file.tmp
  2. Сортировка file.tmp и name.log , чем сравнивать его по ] comm -23 files.tmp name.log
  3. Передайте список файлов, уникальных для file.tmp в RM Команда

ОБЫЧИТЬСЯ С ПОСТАВИТЕЛЬСТВОМ файлах - в обоих Files.tmp и name.log Это может быть одинаковым (полным или относительно одной папки). Имя файла Разделитель для name.log в этом случае ньролайн .

-1
27.01.2020, 22:05
find -name '*.jpg' -print0 | grep -zZ -vf name.log | xargs -0 COMMAND

замените COMMAND на ls -l и если вам нравится - rm

Edit: Представленная команда рассматривает name.log как набор регенераций. @terdon запомнил tha name.log - это список имен файлов.

Если имена файлов используют обычные "нормальные" символы, этого, вероятно, будет достаточно, но могут возникнуть проблемы, если:

  1. Имена файлов / regexp включают в себя необычные символы типа [, ] и т.д. (в этом случае может не получиться удалить некоторые файлы и даже удалить некоторые файлы, имя которых находится в name.log! Чтобы избежать этого мы можем использовать grep -F или защитить специальную символику в name.log.
  2. Regexp совпадает с подстрокой имен файлов (в этом случае некоторые файлы не будут удалены -- 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
1
27.01.2020, 22:05

Это действительно легкий w/ pax. В нем есть понятие опции -substitution, которая может изменять имена файлов по мере их написания. Также можно указать несколько аргументов -substitution. И, что наиболее уместно, в данном случае, у выбранных членов есть только такое количество аргументов -substitution, которое необходимо для успешного выполнения одного совпадения, но любая подстановка, в результате которой имя файла становится нулевым, приводит к тому, что файл совпадения не будет выбрано.

Для демонстрации:

mkdir test; cd test
touch match nomatch
pax -ws '|^.*/match$|&|' -s '|.*||' ./ |
pax -v

Вышеуказанное делает и изменяет в каталог ./test, создает два файла, затем -wобновляет архив tar в трубу w/ pax, содержимое которой вторым pax -verbosely перечисляет. Вышеуказанное печатается:

-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" и избавиться только от всех нужных вам патнанов.


0
27.01.2020, 22:05

Теги

Похожие вопросы