Perl удалить папку с файлами
Я пытаюсь использовать File::Find, чтобы 1) пройти через заданную папку и подпапки, удалив все файлы, которые старше 30 дней, и Б) если родительская папка пуста после всех удалений, также удалите ее.
Я думал, что 32-й пойдет к подножию дерева и поднимется наверх, но этого не произошло. Скрипт, запущенный при распаковке содержимого некоторых электронных книг, не удалял каталоги с вложенными папками, хотя все файлы были удалены.
3 ответа
Как я могу удалить первую (!) строку текстового файла, если она пуста, используя, например, sed или другие стандартные инструменты UNIX? Я попробовал эту команду: sed '/^$/d' < somefile Но это приведет к удалению первой пустой строки, а не первой строки файла, если он пуст. Могу ли я дать sed.
Как прокомментировал Miller , вы не можете unlink каталог. Кроме того, File::Find делает chdir в каталог, содержащий узел, прежде чем он вызовет wanted . Это означает, что в подпрограмме postprocess вы пытаетесь удалить свой текущий рабочий каталог. Windows это не понравится.
Я бы написал это так. Я протестировал его, но вы, очевидно, должны быть очень осторожны со всем, что удаляет содержимое вашего дискового хранилища.
Я подозреваю, что на самом деле вы не удаляете каталог. Из документации по unlink :
Примечание: unlink не будет пытаться удалить каталоги, если вы не являетесь суперпользователем и флаг -U не указан для Perl. Даже если эти условия соблюдены, имейте в виду, что отключение ссылки на каталог может нанести ущерб вашей файловой системе. Наконец, использование unlink в каталогах не поддерживается во многих операционных системах. Вместо этого используйте rmdir .
Мне никогда не нравилось File::Find , потому что это просто беспорядок. Он поглощает всю вашу программу, потому что хочет, чтобы все было в вашей нужной подпрограмме. Кроме того, мне не нравится тот факт, что половина моего кода разбросана повсюду. Однако какие другие инструменты входят в стандартную комплектацию при каждой установке Perl. Я должен как-то обойтись.
Я предпочитаю бросать все свои файлы в массив. Он сохраняет код в чистоте. Мой find просто находит. Я выполняю rest своей обработки в другом месте. Я также встраиваю свою нужную подпрограмму, встроенную в мою команду поиска. Он держит все в одном месте.
Кроме того, вы не можете использовать unlink для удаления каталога. Используйте remove_tree из File::Path . Это стандартный модуль. Вы также можете использовать readdir , чтобы узнать, сколько подкаталогов в каталоге. Это хороший способ проверить, пусто ли оно:
Обратите внимание, что я внедрил свою рутину wanted :
Альтернатива заключается в следующем:
Проблема в том, что моя подпрограмма wanted содержит три глобальные переменные. И, возможно, моя команда find будет отделена от моей подпрограммы wanted . Через 3 месяца вам придется искать по всему вашему коду, чтобы найти эту процедуру wanted .
И когда вы видите эту подпрограмму wanted , есть эти три загадочные глобальные переменные. Где они определены? Это ошибка?
Объединив подпрограмму с моей находкой, я гарантирую, что подпрограмма, необходимая команде find , не ускользнет от моей find . Кроме того, он скрывает глобальность этих трех переменных, встроенных в мою подпрограмму.
Ничто не мешает мне удалить файлы внутри команды find. Обычно не рекомендуется изменять структуру каталогов во время поиска, но это должно быть нормально.
Тем не менее, мне нравится, когда моя команда find просто находит файлы, которые меня интересуют. Я не хочу, чтобы туда засунули 1/2 моей программы. Это становится кошмаром технического обслуживания. Я смирюсь с некоторой неэффективностью. Это может занять целую секунду или две, чтобы загрузить мой массив @files с миллионом файлов, но я потрачу гораздо больше времени, как только мне придется отлаживать свою программу.
Как я могу удалить все файлы в каталоге (без удаления каталога) в Perl? Мой хост позволяет только до 250 000 files, и моя папка /tmp быстро заполняет эти 250 000 qouta всеми сессионными файлами cookie. В этой ситуации я не могу удалить папку /tmp. Мне разрешено только удалять файлы внутри. EDIT .
У меня есть обычный установочный проект VS 2015 (установил расширение, так что оно выглядит как установочные проекты VS 2010 и старше). В разделе файловая система на целевой машине я добавил папку MyAppFolder, а затем добавил основной вывод одного из проектов решения. Затем VS добавил еще кучу.
Похожие вопросы:
Я пишу инструмент, который позволит мне пройти через довольно большой список каталогов и подкаталогов. Я бы хотел, чтобы он удалил папку, если там она пуста. Я могу удалить пустые папки и подпапки с.
Как я могу удалить первую (!) строку текстового файла, если она пуста, используя, например, sed или другие стандартные инструменты UNIX? Я попробовал эту команду: sed '/^$/d' < somefile Но это.
Как я могу удалить все файлы в каталоге (без удаления каталога) в Perl? Мой хост позволяет только до 250 000 files, и моя папка /tmp быстро заполняет эти 250 000 qouta всеми сессионными файлами.
У меня есть обычный установочный проект VS 2015 (установил расширение, так что оно выглядит как установочные проекты VS 2010 и старше). В разделе файловая система на целевой машине я добавил папку.
Я пытаюсь создать batch file, который будет делать следующее: Он будет сканировать все подпапки в определенном каталоге для конкретного файла. Если он найдет файл в подпапке, то все содержимое этой.
В корзине хранения Google есть папка. Мне нужно удалить (с JSON API) папку (пусть обозначим ее xxx/ ) тогда и только тогда, когда она пуста. Самый очевидный способ-проверить, пуст ли он, и удалить.
интересно, какой самый простой способ удалить каталог со всеми его файлами в нем?
Я использую rmdir(PATH . '/' . $value); чтобы удалить папку, однако, если внутри нее есть файлы, я просто не могу ее удалить.
есть по крайней мере два варианта, доступных в настоящее время.
перед удалением папки удалите все файлы и папки (и это означает рекурсию!). Вот пример:
и если вы используете 5.2+ вы можете использовать RecursiveIterator, чтобы сделать это без необходимости делать рекурсию себе:
обычно я использую это для удаления всех файлов в папке:
и тогда вы можете сделать
каков самый простой способ удалить каталог со всеми его файлами в нем?
короткая функция, которая выполняет эту работу:
Я использую его в классе Utils, как это:
С большой силой приходит большая ответственность: когда вы вызываете эту функцию с пустым значением, она удаляет файлы, начинающиеся с root ( / ). В качестве гарантии вы можете проверить, пуст ли путь:
это более короткая версия отлично работает для меня
алгоритм, описанный там (который работал как шарм в моем случае):
здесь у вас есть одна хорошая и простая рекурсия для удаления всех файлов в исходном каталоге, включая этот каталог:
функция основана на рекурсии, сделанной для копирования каталога. Вы можете найти эту функцию здесь: скопируйте все содержимое каталога в другой с помощью php
вы можете использовать Symfony это файловой системы (код):
однако я не мог удалить некоторые сложные структуры каталогов с помощью этого метода, поэтому сначала вы должны попробовать его, чтобы убедиться, что он работает правильно.
Я мог бы удалить указанную структуру каталогов, используя конкретную реализацию Windows:
И просто для полноты, вот мой старый код:
Я предпочитаю это, потому что он по-прежнему возвращает TRUE, когда он преуспевает, и FALSE, когда он терпит неудачу, а также предотвращает ошибку, когда пустой путь может попытаться удалить все из"/*".
Я получаю ошибку "доступ запрещен", когда я пытаюсь удалить папку, которая не пуста. Я использовал следующую команду в своей попытке: os.remove("/folder_name") .
каков наиболее эффективный способ удаления / удаления папки / каталога, который не является пустым?
конструкция rmtree не на деревьях папок, содержащих файлы только для чтения. Если вы хотите удалить папку независимо от того, содержит ли она файлы только для чтения, используйте
из Python 3.4 вы можете использовать :
здесь pth это pathlib.Path экземпляра. Хорошо, но не самый быстрый.
Если ignore_errors установлен, ошибки игнорируются; в противном случае, если onerror установлен, он вызывается для обработки ошибки с аргументами (func, path, exc_info), где func-os.listdir, os.удалить, или ОС.rmdir; path-это аргумент этой функции, который вызвал ее сбой; и exc_info-это кортеж, возвращаемый sys.exc_info(). Если ignore_errors имеет значение false, а onerror-None, возникает исключение.введите код здесь
Если вы уверены, что хотите удалить все дерево dir, и больше не заинтересованы в содержимом dir, то ползать по всему дереву dir-глупость. просто вызовите команду native OS из python, чтобы сделать это. Это будет быстрее, эффективнее и потребляет меньше памяти.
в python код будет выглядеть так..
база на ответ kkubasik, проверьте, существует ли папка перед удалением, более надежная
в этом примере показано, как удалить дерево каталогов в Windows, где некоторые файлы только для чтения бит. Он использует onerror обратный вызов, чтобы очистить бит readonly и повторно подключить remove. Любой последующий сбой будет распространяться.
Если вы не хотите использовать
удалить папку, если пустой
удалить папку если она содержит этот файл
удалить папку, если она содержит только .srt or .txt файл(ы)
удалить папку, если ее размер меньше 400 КБ:
вы можете использовать ОС.системная команда для простоты:
как очевидно, он фактически вызывает системный терминал для выполнения этой задачи.
удалить папку, даже если она может не существовать (избегая условия гонки в ответ Чарльза Чоу), но все еще есть ошибки, когда другие вещи идут не так (например, проблемы с разрешением, ошибка чтения диска, файл не является каталогом)
Если вы пропустили предыдущие три части, я бы советовал начать чтение с начала . В принципе, эту серию уроков можно читать в произвольном порядке и во всем разобраться, но зачем усложнять себе жизнь?
В отличие от предыдущих уроков, которые можно было читать практически без подготовки, сегодня от вас потребуется понимание того, что такое стандартные потоки ввода и вывода, файловый дескриптор, права доступа к файлам и тп. К сожалению, эти вопросы выходят за рамки статьи, так что вам предстоит разобраться в них самостоятельно. К счастью, с этим вам поможет практически любая книжка по основам ОС семейства UNIX. Да и в сети соответствующих статей должно быть в изобилии.
Ввод и вывод
Как всегда, давайте начнем с примера:
Функция chomp проверяет, находится ли в конце строки-аргумента символ новой строки (\n) и если он присутствует, отсекает его. Если такого символа нет, строка остается без изменений.
print STDOUT "Вывод строки в стандартный поток вывода \n " ;print STDERR "Вывод строки в стандартный поток ошибок \n " ;
Только что мы рассмотрели открытие файла на чтение. Чтобы открыть файл на запись, нужно перед его именем указать > или >>:
В заключение к этому разделу хотелось бы рассказать об интересной особенности оператора <>. Дело в том, что он может использоваться без указания файлового дескриптора:
В этом случае, если скрипт был вызван без аргументов, оператор будет производить чтение из STDIN. В противном случае все аргументы будут рассматриваться, как имена файлов. Чтение будет производиться по очереди из каждого файла. Можно сказать, что этот скрипт представляет собой аналог утилиты cat.
Работа с каталогами
Тут все настолько просто, что даже комментировать не хочется. Давайте лучше сразу перейдем к более интересному примеру:
Существует и более короткая запись:
А еще можно так:
Использовать функцию glob лучше в тех случаях, когда в выражение нужно подставить переменную.
Другие операции над файлами и каталогами
Также в Perl имеется несколько довольно полезных операторов:
Заключение
Дополнение. См также заметки, посвященные регулярным выражениям, объектно-ориентированному программированию в Perl и заливке модулей на CPAN. Можете считать их дополнениями к этой серии уроков.
Читайте также: