LINUX.ORG.RU
ФорумAdmin

Удалить файлы не не содержащиеся в списке

 ,


0

1

Всем привет! Подскажите пожалуйста как можно удалить все файлы в папке кроме перечисленных в файле? Сложность вот в чем: Файл со списком (list.txt) содержит в себе список в таком формате: 33245 2415 34222 6688 306302 534

Имена файлов в папке вот в таком формате: file_33245.0 file_2415.0 file_2415.1 file_34222.0 file_6688.0 file_306302.0 file_534.0 file_287612.0 file_287612.1 И так далее.

# cat > grep_or_rm.sh <<"EOF"
#!/bin/bash

grep_or_rm () {

  grep "file_${1}." "list.txt" || echo rm "$1"

}

grep_or_rm "$@"
EOF

# chmod +x ./grep_or_rm.sh

# find . -type f -exec ./grep_or_rm.sh {} \;
Spoofing ★★★★★
()
Ответ на: комментарий от Spoofing

Я пробовал так, но так он удаляет только при полном соответствии имени в списке и в папке

#!/bin/bash

cd /tmp/files/

# Exit if the directory isn't found.
if (($?>0)); then
    echo "Can't find work dir... exiting"
    exit
fi

for i in *; do
    if ! grep -qxFe "$i" /tmp/list.txt; then
    $d "pgsql_tmp1"$i".*"
    echo "$d"
        #echo "Deleting: $i"
        # the next line is commented out.  Test it.  Then uncomment to removed the files
        # rm "$i"
        #find /tmp/files/ -type f -not -name "$i" -print0 |xargs -0 rm
    fi
done
iwizard7
() автор топика
int@blackhorse test 0 0.25 $ ls
bar  baz  file_1111.0  file_2222.0  file_3333.0  foo
int@blackhorse test 0 0.23 $ rm -rf !(*1111*|*2222*|*3333*)
int@blackhorse test 0 0.18 $ ls
file_1111.0  file_2222.0  file_3333.0
int@blackhorse test 0 0.18 $
ubik
()
Последнее исправление: ubik (всего исправлений: 1)

Не проверял, но:

find . -type f | grep -vf list_of_files.txt | xargs -i rm '{}'
PRN
()

Всем привет! Подскажите пожалуйста как можно удалить все файлы в папке кроме перечисленных в файле? Сложность вот в чем: Файл со списком (list.txt) содержит в себе список в таком формате: 33245 2415 34222 6688 306302 534

Имена файлов в папке вот в таком формате: file_33245.0 file_2415.0 file_2415.1 file_34222.0 file_6688.0 file_306302.0 file_534.0 file_287612.0 file_287612.1 И так далее.

В текстовую строку поместите «33245 2415 34222 6688 306302 534» и ищите в ней не «file_2415.1», а "2415 ".

anonymous
()
Ответ на: комментарий от iwizard7

Дело в том что Файлы в этой папке (и списке) всегда будут с разными именами

Главное, что формат представления имени файла один и тот же …

anonymous
()
Ответ на: комментарий от iwizard7

fix

У тебя и заголовок темы, и описание задания косноязычное – понять что же требуется сделать можно только из общения с тобой.

Удалить из каталога все файлы имена которых не содержат строки из следующего списка...

оно?

anonymous
()

Удалить файлы не не содержащиеся в списке

«не не содержащиеся в списке» равносильно «содержащиеся в списке»

anonymous
()

возьми нормальный язык программирования, где не нужно изобретать ничего для проверки вхождения элемента в множество

anonymous
()

А в чем проблема сначала переименовать папку с файлами, создать с таким именем что было папку и потом все файлы из списка переместить в созданную, после чего удалить переименованную.

Так по идее меньше придётся проверок делать, чем проверять каждый файл на вхождение в список из твоего файла. Ну это если лишних файлов там много.

xmikex ★★★★
()
Ответ на: комментарий от xmikex

ну-ка, ну-ка раскрой секрет экономии на спичках проверках

потом все файлы из списка переместить в созданную

как узнать входит файл в список или нет? для простоты в списке одно имя, в папке 3 файла – случай много проще, чем описывает ТС. давай свой алгоритм рассказывай. в его списке нет полных имен файлов, так фрагменты.

я уже молчу про гениальный ход с созданием/перемещением файлов/каталогов

anonymous
()

«От сессии до сессии живут студенты весело …»

anonymous
()

На этом форуме Метапрог самый старший.
Попроси у него помощи. Он даже решение квадратных уравнений для частных случаев осилил.
Вообщем поможет.

anonymous
()
Ответ на: комментарий от boowai

Не сработало. Наоборот, удалились только те что в перечислены в списке. Которых не было в вписке, он не тронул.

iwizard7
() автор топика
Ответ на: комментарий от xmikex

Файлы в папке используются приложением. Просто так переместить их не получится. В том и суть что нужно удалить файлы не используемые. Список с которыми приложение работает в данный момент и есть в этом файле.

iwizard7
() автор топика
Ответ на: fix от anonymous

Да, все так

iwizard7
() автор топика
Ответ на: комментарий от iwizard7

Я, как и следующий, предложил только идею, а не точную раелизацию. Сейчас могу сказать, что наверно надо | sort list.txt - |. И я вижу, что мой вариант довольно топорно построен, а следующий лучше выглядит, и там только в -i у xargs сомневаюсь.

boowai ★★★★
()
Ответ на: комментарий от boowai

Прошу прощения если обидел, не хотел. В баше мои знания еще очень и очень малы, потому и попросил помощи на форуме :) Инверсия | sort list.txt - | увы, тоже не сработала.

iwizard7
() автор топика
Ответ на: комментарий от iwizard7

Это не инверсия. В sort подаются строки из файла по его имени, а обычно опускаемый - подает результаты левой части до | в него же.
uniq --unique же вернул бы строки, которые не дублировались. Без - не с чем сравнивать.

Попробуй сначала вводить команды и проверять, добавляя по одной в цепочку. Т.е. ls -1 , ls -1 |cut -d '.' -f 1 , ls -1 |cut -d '.' -f 1 |cut -d '_' -f 2 . И так до конца. Понятнее будет.

ls выдаст список файлов, cut по разделителю вырезает первую а потом вторую часть строки. xargs передаст результат на в аргументы другой программы. Фокус с sh подберет имена файлов. rm удалит. Но повторю, другой вариант проще выглядит, но или -i просто убрать, или использовать как у меня -I{} rm {}

Кого-то обидеть в интернете сложно. Я просто хочу сказать, что на этом форуме предпочитают быть «Ъ». А «Ъ»:

  • По ссылкам не ходят
  • Тред не читай, сразу отвечай
  • Даже сообщение темы могут не читать, а только заголовок

Т.е. можно особо не ждать проверенных и точно работающих ответов. Нам за это не доплачивают и не минусуют. Те, кто напишет десяток строк кода или попробует запустить что-то хоть немного сложное - скорей исключение. Лично я с мобилки пишу сейчас, так что даже не вижу толком, что набираю.

boowai ★★★★
()
Последнее исправление: boowai (всего исправлений: 1)
import os 
import re

fp = open("/tmp/list.txt", "r")
content = fp.read()
fp.close()

guarded_filenames = content.strip().split(" ")

for entry in os.scandir("/tmp"):
    remove_this_entry = True
    for guarded_filename in guarded_filenames:
        if (re.compile(f'file_{guarded_filename}.\d').match(entry.name)):
            remove_this_entry = False
    if (remove_this_entry == True):
        print(f'Removing {entry.path}')
        # os.remove(entry.path)

иногда проще накатать простейший скрипт, чем городить адовые портянки на баше

Ford_Focus ★★★★★
()
Последнее исправление: Ford_Focus (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.