Удалить все файлы в папке кроме
В директории удалить все файлы кроме заданных
На самом деле это единственный раздел про unix на этом форумеМодератор: /dev/random
В директории удалить все файлы кроме заданных
Как в текущей директории удалить все файлы кроме заданных? Например директория "/dir1", а неудаляемые файлы "file1", "file2". Как в текущей директории удалить все файлы кроме заданных? Например директория "/dir1", а неудаляемые файлы "file1", "file2".как-то так.
Это -delete не нужно сразу ставить, лучше сначала без него посмотреть, что получается.
PS: если есть какие-то каталоги, в которые НЕ нужно заходить вообще, используйте -prune
PS2: обход осуществляется в обратном порядке, каталоги тоже обходятся. И симлинки с хардлинками. Будьте внимательны.
PS3: ещё полезно -empty, которая даёт Ъ, если файл/каталог пуст.
Скоро придёт
Осень
И чего здесь плохого? При выводе в пайп ls выдаст тот же результат, что и find. Разве что при именах с пробелами потребуется дополнительная обработка.
Да и лишнего написали много. Я думал, любителям sed свойственна чрезмерная лаконичность, а не наоборот. :)
если есть какие-то каталоги, в которые НЕ нужно заходить вообще обход осуществляется в обратном порядке, каталоги тоже обходятся UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis RitchieThe more you believe you don't do mistakes, the more bugs are in your code. И чего здесь плохого? При выводе в пайп ls выдаст тот же результат, что и find. Разве что при именах с пробелами потребуется дополнительная обработка.
плохо то, что ls не обладает никакими способами обхода. Да и выдавать нормальные имена она умеет через. Неинтуитивно (через --quoting-style=WORD, а вот как вы ЭТО будете пихать в rm, это ещё один отдельный вопрос.
Да и лишнего написали много. Я думал, любителям sed свойственна чрезмерная лаконичность, а не наоборот. :)
а я думал, что даже фанатеги микроскопа всё равно не станут рекомендовать забивать своим тотемом гвозди. (:
На самом деле -- я пробовал. Способ с ls|sed|rm тупо не нужен, ибо тупо неудобен. ИМХО.
каталог ./d1/d2/d3/d4/ тоже "в текущей директории". Разве не так?
ещё PS: для задания глубины find умеет -maxdepth и -mindepth, а ls не умеет (только -R умеет)
Скоро придёт
Осень
Строго говоря, нет. Он в директории d1/d2/d3/
Конкретно насчет find-а согласен. Да и то только при обработке самим find-ом либо -print0 | xargs -0
А насчёт for, видимо, осталась привычка со старых версий bash, где конструкция "for f in *" и пробелы-то нормально не обрабатывала - в этом смысле надо переучиваться. (:
строго говоря d1 тоже файл, и его тоже надо удалять. Почему нет?
Да и то только при обработке самим find-ом либо -print0 | xargs -0
ну а зачем вообще имя передавать? Лишняя сущность это всегда источник ошибок ИМХО.
Скоро придёт
Осень
Вы знаете людей, которые всерьез называют каталоги файлами? Я таких не встречал.
ну а зачем вообще имя передавать? Лишняя сущность это всегда источник ошибок ИМХО. Конкретно в этом случае согласен. В более сложных это может быть гораздо меньшим источником ошибок, чем нагромождения скобок и вызовы subshell-ов внутри самого find-а.Я извиняюсь конечно, может чего не поняла, но зачем так сложно? Ведь оболочка распознает шаблоны.
Вы знаете людей, которые всерьез называют каталоги файлами? Я таких не встречал.а я такого каждый день наблюдаю. В зеркале.
Да и вообще считаю, что называть каталоги файлами -- это такое Дао, которое просто необходимо пройти, если не хочешь всю жизнь прозябать в криво поставленном кем-то маздае.
Как всегда, ВСЁ выше(и ниже) изложенное == МХО.
а по моему опыту сложная команда find работает быстрее, и изменять её удобнее. Даже в том случае, если её результат -- список файлов, который потом как-то иначе обрабатывается.
И да, субшеллы внутрь find я-бы не рекомендовал пихать. Их можно и снаружи организовать ввиде конвейера.
В итоге, по моему опыту, если нужно выполнить сложную задачу из серии "взять файлы по сложному условию и выполнить сложное действие над ними" лучше выполнять таким кодом:
Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c . z мне нужно удалить все, кроме u и p . Есть простой способ сделать это?
Ответы ниже намного лучше, но вы можете просто сделать файлы для сохранения только для чтения, удалить все, а затем изменить их обратно на исходные права (если вы не используете rm -f). Вы должны были бы знать, какие разрешения восстанавливать, и вы должны знать, что ничто не требовало доступа к ним для записи во время процесса. Вот почему другие ответы лучше. Если вы также хотите удалить скрытые файлы, запустите shopt -s dotglob перед запуском rm (. ) .Что я делаю в этих случаях, чтобы набрать
Затем я нажимаю Ctrl + X , * чтобы развернуть * все видимые имена файлов.
Затем я могу просто удалить два файла, которые я хочу сохранить из списка, и, наконец, выполнить командную строку.
Я думаю, это работает только до тех пор, пока список файлов, который * расширяется, не становится слишком длинным. : -> @SantoshKumar: Это не имеет смысла для меня. Расширение всегда будет работать, оно не зависит от того, какую команду вы хотите использовать впоследствии. @OliverSalzburg К сожалению, комбинация немного сбивает с толку. Я думаю, что вы должны написать как Ctrl + Shift + x + *Для rm всех, кроме u,p Bash просто введите:
Для этого необходимо установить следующую опцию:
у вас должен быть активен "extglobbing": shopt -s extglob Тебе нужно shopt -s extglob , @Ashot. Кроме того, это просто файлы, а не каталоги, поэтому я удалил -rf опции в вашей команде. Если необходимо исключить один файл из выбора файлов, попробуйте следующее: rm !(index).html . Это удалит все файлы, оканчивающиеся на «.html», за исключением «index.html».Ты можешь использовать find
- ! отменяет следующее выражение
- -name указывает имя файла
- -maxdepth 1 заставит процесс поиска только указанную директорию ( find по умолчанию проходит каталоги)
- -type f будет обрабатывать только файлы (а не, например, каталоги)
- -delete удалит файлы
Затем вы можете настроить условия, просмотрев справочную страницу поиска.
Обновить
-
Имейте в виду, что порядок элементов выражений является значительным (см. Документацию)
Сначала проверьте свою команду, используя -print вместо -delete
порядок предикатов здесь имеет решающее значение. Если один положить -delete сразу после . этого будет катастрофа (удалит все файлы в CWD) Это можно записать более компактно, как find . -maxdepth 1 -type f -name '[^up]' -delete @kojiro да, но только для файлов, состоящих всего из одной буквы. С более сложными именами регулярное выражение может быть беспорядком. find мой лучший друг, особенно когда слишком много файлов, чтобы их потерятьmv файлы, которые вы хотите в верхнем каталоге, rm каталог, а затем mv их обратно.
Конечно, мв их в каталог выше. Постарайтесь не переносить их в подкаталог, который вы Это перезапишет файлы с одинаковыми именами в каталоге назначения Я не одобряю это, потому что, хотя это может быть удобно, оно также не является атомарным и эффективно удаляет все файлы из каталога в течение короткого периода времени; это было бы неприемлемо, если, например, файлы совместно используются в сети.В некоторой степени похож на этот ответ, но никаких специальных опций не требуется, насколько я знаю, что «древняя» функциональность поддерживается любой (смутно) / bin / sh, похожей на оболочку (например, bash, zsh, ksh и т. Д.)
Это работает для 1-символьных имен файлов. Для длинных имен лучше ответ Спарки. Что было бы не так с rm [^up]* ? Я делаю подобные вещи довольно часто. @ MichaelKjörling - это удалит все файлы, начинающиеся с u или p, а не только те, которые имеют имена u и p. Я думаю, что OP (@Ashot) означало az и u, p и т. Д. символически, а не буквально. @HobbesofCalvin Это удалит все файлы, не начинающиеся с u или p, а не те, которые начинаются с них.Делаем это без поиска:
(Отредактируйте: «u» и «v», как и в других местах здесь, используются в качестве универсальных версий целых регулярных выражений. Очевидно, что вам нужно быть осторожным, чтобы привязать свои регулярные выражения, чтобы избежать совпадения слишком многих вещей.)
Вы определенно будете хотеть сценарий, если вы собираетесь делать большую часть этого, как предлагали другие.
grep не будет обрабатывать расширенное регулярное выражение по умолчанию: либо используйте, -E либо egrep @ Matteo Нет, не будет. Grep не grep файлы, это grep вывод команды ls. Вы думаете о чем-то вроде grep -L (u|p)' * | xargs rm где -L означает список имен файлов, не содержащих совпадения. Вот удалите все, кроме этих матчей! ls | grep -v 'vuze\|progs' | xargs rm -rfВторой будет работать , даже если у вас есть ^ в $histchars течение подмены истории, и, конечно , вы можете поставить произвольную Glob перед
При использовании sudo rm -r , как я могу удалить все файлы, за исключением следующего:
Есть 2 способа прочитать этот вопрос, и существующие ответы охватывают обе интерпретации: ЛИБО: (а) сохраняйте файлы с указанными именами, непосредственно расположенные в целевом каталоге, и - как это rm -r подразумевается - удаляйте все остальное, включая подкаталоги, - даже если они содержат файлы с указанными именами; ИЛИ: (b) пройти по всему поддереву целевого каталога и в каждом каталоге удалить все файлы, кроме файлов с именами в списке.Если вы не укажете, -type f find также выведет список каталогов, которые вам могут не понадобиться.
Или более общее решение с использованием очень полезной комбинации find | xargs :
например, удалить все не TXT-файлы в текущем каталоге:
print0 И -0 комбинация необходима , если есть пробелы в любом из имен файлов , которые должны быть удалены.
удалить несколько шаблонов: find . -type f -not -name '*ignore1' -not -name '*ignore2' | xargs rm как насчет каталогов? он удалит все файлы, но удалит ли он папки ?! Вместо «| xargs rm» команда find принимает параметр -delete. вместо -print0 | xargs -0 rm -- тебя можно просто -deleteExtglob (Extended Pattern Matching) должен быть включен в BASH (если он не включен):
Когда я это делаю, я получаю "синтаксическую ошибку рядом с неожиданным токеном` ('" shopt -s extglob; rm -rf !(README|LICENSE) . Есть идеи почему?" @ nnic Я не помню, извини. Я, вероятно, в конечном итоге использовать find с -delete опцией. Это лучшее решение для меня, и оно работает по умолчанию на моей Ubuntu 12.04.4 LTS без необходимости покупки @nic, @Dennis: синтаксическая ошибка предполагает, что что-то ДРУГОЕ, чем bash было использовано, например dash , где extglob не поддерживается. Однако в интерактивной bash оболочке команда также не будет работать, как указано, хотя и по другим причинам. Суть в том, чтобы выполнить себя shopt -s extglob ; РАЗ УСПЕШНО ВКЛЮЧЕНО (проверьте с помощью shopt extglob ), выполните rm -rf !(README|LICENSE) . (Хотя extglob он еще не включен, !(. ) оценивается расширением истории ДО того, как команды будут выполнены; поскольку это, скорее всего, не сработает, команда NEITHER будет выполнена и extglob никогда не будетfind . | grep -v "excluded files criteria" | xargs rm
При этом будут перечислены все файлы в текущем каталоге, затем перечислены все те, которые не соответствуют вашим критериям (остерегайтесь совпадения с именами каталогов), а затем удалите их.
Обновление : на основе ваших правок, если вы действительно хотите удалить все из текущего каталога, кроме файлов, которые вы перечислили, это можно использовать:
Это создаст резервную копию каталога /tmp_backup (у вас есть права root, верно?), Переместит файлы, которые вы перечислили в этот каталог, рекурсивно удалите все в текущем каталоге (вы знаете, что вы находитесь в правильном каталоге, не так ли?), Переместите вернуться к текущему каталогу все /tmp_backup и, наконец, удалить /tmp_backup .
Я выбираю каталог резервного копирования в качестве корневого, потому что если вы пытаетесь рекурсивно удалить все из корневого каталога, у вашей системы будут большие проблемы.
Конечно, есть более элегантные способы сделать это, но этот довольно простой.
Иногда вам нужно удалить почти все файлы из каталога, но вы хотите сохранить один или несколько из них. Когда их много, идти по одному - утомительное занятие. Это не лучший вариант, есть способы значительно упростить работу в Linux и можно сразу избавиться от всех, что вам нужно.
Например, вы можете удалить только те, которые начинаются с определенного имени, или те, которые имеют определенное расширение, и так далее. Все что возможноФактически, в других случаях я уже показывал аналогичные уроки в LxA. Здесь вы можете шаг за шагом и простым способом следовать руководству, чтобы удалить все нужные файлы, кроме тех, которые вы хотите сохранить.
И самое лучшее то, что вам не нужно будет устанавливать какую-либо программу, это легко сделать с помощью таких команд, как rm и find. То есть программы, которые уже предустановлены в любом дистрибутиве Linux. И, конечно же, метод будет основан на поиске шаблонов и использовании этих совпадений для удаления только того, что вы хотите.
Ну чтобы там исключить несколько альтернатив, Кто они такие…
Удалить файлы из каталога с помощью rm
Ну, чтобы использовать команда rm Чтобы избавиться от того, что вы чувствуете, вы должны знать перед некоторыми способами выявления закономерностей:
- * (список шаблонов) - соответствует нулю или более вхождений указанных шаблонов
- ? (список шаблонов) - соответствует нулю или одному вхождению указанных шаблонов
- + (список шаблонов) - соответствует одному или нескольким экземплярам указанных шаблонов
- @ (список шаблонов) - соответствует одному из указанных шаблонов
- ! (список шаблонов) - соответствует чему угодно, кроме одного из заданных шаблонов
к активировать extglob Чтобы использовать их, вы должны сначала выполнить следующую команду:
глаз! Я не указываю это, но предполагается, что у вас есть разрешения на выполнение этих операций и что вы находитесь внутри этого каталога, когда выполняете команду rm. Будьте осторожны с этим, потому что, если вы запустите его по другому пути, вы можете удалить файлы, которые вам не нужны. То есть перед выполнением этих команд убедитесь, что вы вошли в нужный каталог с помощью cd.
Теперь вы можете использовать rm, чтобы удалить все, что захотите. Например, удалить все файлы из каталога, кроме тех, которые соответствуют имени «Lxa»:
Вы также можете указать два или более имен, которые вы не хотите удалять. Например, чтобы избежать удаления lxa и desdelinux:
Вы можете удалить все файлы, минус те, с расширением .mp3. Например:
В конце вы можете вернуться к отключить extglob:
Удалить файлы из каталога с помощью find
Другая альтернатива rm - используйте find, чтобы удалить то, что вам нравится. Вы можете использовать канал и xargs с rm или использовать параметр -delete для поиска. То есть общий синтаксис будет таким:
Например, представьте, что вы хотите удалить все файлы из каталога, кроме файлов с расширением .jpg, вы можете использовать одну из этих двух команд, поскольку обе они дают одинаковый результат:
Вместо этого, если вы хотите добавить дополнительный узор, ты тоже мог бы. Например, предположим, что вы не хотите удалять файлы .pdf или .odt из каталога:
Конечно, вы можете сделать то же самое с | и xargs, как в предыдущем примере. Кстати, мы использовали -не отрицать, но вы можете удалить это, чтобы сделать его положительным, то есть удалить совпадающие шаблоны, а не исключать их.
Удалите файлы из каталога с помощью переменной GLOBIGNORE
Наконец, есть Другая альтернатива чтобы найти и rm, и он использует переменную среды, чтобы указать файлы, которые вы хотите удалить или исключить. Например, представьте, что вы хотите удалить все файлы в каталоге с именем Downloads, сохранив файлы .pdf, .mp3 и .mp4. В этом случае вы можете сделать следующее:
Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.
Полный путь к статье: Любители Linux » GNU / Linux » Системное администрирование » Как удалить все файлы в каталоге, кроме одного
Читайте также: