Мне нужно периодически очищать папку. Я получаю список файлов, который содержит текст, какие файлы разрешены. Теперь я должен удалить все файлы, которых нет в этом файле.
Пример:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Моя папка делает очистку содержит это как пример:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Так что эти файлы должны быть удалены:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Я ищу что-то, чтобы создать команду удаления с возможностью исключить некоторые файлы, предоставленные файлом.
command-line
bash
scripts
rm
stefan83
источник
источник
Ответы:
rm
закомментирована, так что вы можете проверить и убедиться, что она работает по мере необходимости. Тогда просто откомментируйте эту строку.check directory
раздел гарантирует, что вы случайно не запустите скрипт из неправильного каталога и не забьете неправильные файлы.Вы можете удалить
echo deleting
линию, чтобы работать тихо.источник
ls
и бесполезного захвата выходных данных,grep
если все, что вы хотите знать, это то, было ли совпадение или нет. Я также использовал шаблоны с фиксированной строкой, чтобы избежать проблем.while
цикл наfor
цикл, вы случайно изменили егоiteration key
сi
наf
. в декларации, которая нарушила код. Я починил это.f
. ;-P (… и +1 за ваш ответ, который я забыл ранее.)Этот скрипт Python может сделать это:
Важной частью является раскомментирование
os.unlink()
функции.ПРИМЕЧАНИЕ : добавьте этот скрипт и
dont-delete.txt
свой,dont-delete.txt
чтобы они оба были в списке, и держите их в одном каталоге.источник
set
вместо списка O (1) вместо поиска O (n) во второй части.Вот одна строка:
ls
печатает все файлы в текущем каталоге (в отсортированном порядке)sort dont_delete
печатает все файлы, которые мы не хотим удалять в отсортированном порядке<()
оператор преобразует строку в файл-подобный объектcomm
команды сравнивают два предварительно отсортированные файлы и печатает линию , на которых они отличаются-2 -3
флагов приводитcomm
к печати только строк, содержащихся в первом файле, но не во втором, который будет списком файлов, которые можно безопасно удалитьtail +2
вызов просто удалить заголовокcomm
вывода, который содержит имя входного файлаxargs
поток, который превратит выходной поток в список аргументов дляrm
. В-p
опции силыxargs
попросить подтверждение перед выполнением.источник
Похоже, что вы можете сделать это изначально
zsh
, используя(+cmd)
квалификатор glob.Для иллюстрации давайте начнем с некоторых файлов
и файл белого списка
Сначала прочитайте белый список в массив:
или, может быть, лучше
(эквивалент
mapfile
встроенного в bash - или его синонимreadarray
). Теперь мы можем проверить, существует ли ключ (имя файла) в массиве, используя${keepfiles[(I)filename]}
который возвращает 0, если совпадение не найдено:Мы можем использовать это для создания функции, которая возвращает,
true
если$REPLY
в массиве нет совпадений :Наконец, мы используем эту функцию в качестве квалификатора в нашей команде:
или, в вашем случае
(Вероятно, вы захотите добавить имя файла белого списка в белый список.)
источник
Предполагая, что ваша оболочка bash имеет
extglob
shopt
значение on, вот несколько более консервативная альтернатива:(... сопровождающий в противном случае отличное предложение комманда @ gardenhead!)
источник
Если выходные данные не
ls /home/me/myfolder2tocleanup/
превышают максимальный предел аргумента оболочки,ARG_MAX
который составляет около 2 МБ для Ubuntu, я бы предложил следующее.Однострочная реализация команды, которая сделает эту работу, будет выглядеть следующим образом:
dont-delete.txt
файл в каталог, содержащий файлы для удаления, например:cd
в каталог, содержащий файлы, которые нужно удалить, вот так:источник
Я настоятельно рекомендую использовать
rsync
решение, размещенное здесь ; иначе используйте приведенное ниже решение с упомянутым исключительным условием.Предполагая, что в ваших файлах, перечисленных в файле с именем
excludelist
, нет пробелов (пробелы / табуляции) , вы должны сделать:Просто добавьте
-delete
команду выше, чтобы удалить файлы, которых нет в файле excludelist . Если находка не имеет-delete
опцию можно использоватьrm
с-exec
следующим образом :Или , используя
-exec
с+
терминатором вместо этого.echo
просто используется для всухую.источник
Мое предложение:
Обновление 2018-08-07
Пример:
Обратите внимание, после строки 3 у вас будет
dont-delete.txt
файл с содержимым:(ведущий
./
это очень важно )Файлы
c
иd
будут удалены.источник