Linux удаляет все, кроме папки

Обновлено: 30.06.2024

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

Удалить все файлы, кроме одного в Linux

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

  • *(список-шаблонов) — соответствует нулю или более вхождений указанных шаблонов
  • ?(список-шаблонов) – соответствует нулю или одному вхождению указанных шаблонов.
  • +(список-шаблонов) — соответствует одному или нескольким вхождениям указанных шаблонов
  • @(список-шаблонов) — соответствует одному из указанных шаблонов
  • !(список-шаблонов) – соответствует чему угодно, кроме одного из заданных шаблонов

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

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

Если вы хотите отключить это расширение, вы можете сделать это с помощью следующей команды.

1. Использование команды rm

Мы рассмотрим различные варианты использования удаления файлов с исключениями. Вот команда для удаления всех файлов в вашей папке, кроме файла с именем data.txt. Замените его именем файла по вашему выбору.

Вот команда для удаления всех файлов в вашей папке, кроме файлов data.txt и project.txt.

В приведенном выше примере мы включили два имени файла, разделенные вертикальной чертой (|). Не забудьте добавить кавычки вокруг каждого имени файла отдельно, как показано выше.

Вот команда для удаления всех файлов, кроме .txt.

Комбинируя предыдущие команды, вот команда для удаления всех файлов, кроме файлов .txt и .pdf.

2. Использование команды поиска

Вы также можете удалить файлы с помощью команды find, как показано ниже. Вот 3 способа удалить все файлы, кроме тех, чьи имена соответствуют заданному шаблону. Замените PATTERN ниже шаблоном регулярного выражения, который соответствует именам файлов, которые необходимо исключить из удаления.

В первой команде команда find сама удаляет файл, используя параметр -delete. В следующих двух командах команда find передает свои выходные данные команде xargs, которая создает отдельную команду rm для этих файлов.

Вот простая команда, чтобы найти и удалить все файлы в вашей папке, кроме файлов .zip.

Вы также можете удалить файлы, кроме файлов .zip, с помощью следующей команды.

Вот команда для удаления файлов, кроме файлов .zip и .pdf.

3. Использование GLOBIGNORE

GLOBIGNORE — это переменная оболочки, в которой вы можете хранить различные имена файлов и расширения, разделенные двоеточием, чтобы исключить их удаление. Вот пример исключения файлов .zip и .pdf из удаления.

Теперь, когда вы запускаете команду rm в любой папке, она не удаляет файлы .zip и .pdf. Вы всегда можете отключить GLOBIGNORE с помощью следующей команды.

Обратите внимание, что приведенная выше настройка GLOBIGNORE будет работать только до тех пор, пока длится ваш сеанс. Если вы хотите сделать его постоянным, вам нужно добавить его в файл ~/.bashrc в качестве переменной среды.

В этой статье мы узнали, как удалять файлы, кроме одного или нескольких, в Linux.

Мне нужно удалить все папки внутри папки, используя ежедневный скрипт. Папку для этого дня нужно оставить.

Папка «моя папка» имеет 3 подпапки: «test1», «test2» и «test3». Мне нужно удалить все, кроме «test2».

Эта команда всегда пытается также удалить главную папку 'myfolder'! Есть ли способ избежать этого?


6 ответов 6

Это приведет к удалению всех папок внутри ./myfolder, кроме папки ./myfolder/test2 и всего ее содержимого:

Как это работает

./myfolder указывает, что find нужно начинать с каталога ./myfolder и его содержимого.

-mindepth 1 не соответствует самой папке ./myfolder, а только файлам и каталогам в ней.

<р>! -regex '^./моя папка/test2\(/.*\)?" указывает find исключить ( ! ) любой файл или каталог, соответствующий регулярному выражению ^./myfolder/test2\(/.*\)? . ^ соответствует началу имени пути. Выражение (/.*\)? соответствует либо (а) косой черте, за которой следует что-либо, либо (б) вообще ничего.

-delete указывает find удалить совпадающие (то есть неисключенные) файлы.

Пример

Рассмотрите структуру каталогов, которая выглядит следующим образом:

Мы можем запустить команду find (без -delete ), чтобы увидеть, что она соответствует:

Мы можем убедиться, что это сработало, просмотрев оставшиеся файлы:


Отличная работа!, но извините: это удалит все файлы внутри ./myfolder . Вам нужен отсутствующий (IMvhO) -type d только для каталогов.

Хорошо, это должно работать так, как вы хотите: find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./моя папка/test2\(/.*\)?'


Удалите эхо, если список файлов вас устраивает.

Использование -mindepth 1 гарантирует, что верхний каталог не выбран.

Но -not -name test2 не будет избегать подкаталогов внутри test2 :

Для этого вам понадобится что-то вроде обрезки:

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

Либо используйте rm -rf (удалите эхо, если хотите действительно стереть):

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

Мне нужно удалить все файлы в каталоге, но исключить некоторые из них. Например, в каталоге с файлами a b c . z, мне нужно удалить все, кроме u и p. Есть ли простой способ сделать это?



Ответы ниже намного лучше, но вы можете просто сделать файлы доступными только для чтения, удалить все, а затем вернуть им исходные разрешения (если вы не используете rm -f). Вы должны были бы знать, какие разрешения восстанавливать, и вы должны были бы знать, что ничего не требует доступа к ним для записи во время процесса. Вот почему другие ответы лучше.

17 ответов 17

Что я делаю в таких случаях, так это печатаю

Затем я нажимаю Ctrl + X , * для расширения * до всех видимых имен файлов.

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

@SantoshKumar: Для меня это не имеет смысла. Расширение будет работать всегда, это не зависит от того, какую команду вы хотите использовать впоследствии.

@OliverSalzburg Извините, комбинация немного сбивает с толку. Я думаю, вы должны писать как Ctrl + Shift + x + *

Чтобы rm все, кроме u,p, в bash, просто введите:

Для этого требуется установить следующий параметр:



Вам нужно купить -s extglob , @Ashot. Кроме того, это просто файлы, а не каталоги, поэтому я удалил параметры -rf в вашей команде.

Если вам нужно исключить один файл из набора файлов, попробуйте следующее: rm !(index).html . Это приведет к удалению всех файлов, оканчивающихся на «.html», за исключением «index.html».

Вы можете использовать поиск

  • ! отрицает следующее выражение
  • -name указывает имя файла
  • -maxdepth 1 заставит поиск выполняться только в указанном каталоге (по умолчанию поиск проходит по каталогам)
  • -type f будет обрабатывать только файлы (а не, например, каталоги)
  • -delete удалит файлы

Затем вы можете настроить условия, просмотрев справочную страницу find

Обновить

    Имейте в виду, что порядок элементов выражений имеет значение (см. документацию)

Сначала проверьте свою команду, используя -print вместо -delete

порядок предикатов здесь имеет решающее значение. Если поставить -delete сразу после . это будет катастрофа (удалит все файлы в CWD)

@kojiro да, но только для файлов, состоящих всего из одной буквы. С более сложными именами регулярное выражение может привести к беспорядку.

mv файлы, которые вы хотите, в верхнем каталоге, rm каталог, а затем mv их обратно.

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

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

Отчасти похоже на этот ответ, но никаких специальных параметров не требуется, насколько я знаю, нижеследующая является «древней» функциональностью, поддерживаемой любой (отдалённо) /bin/sh, напоминающей оболочку (например, bash, zsh, ksh и т. д.)< /p>

@MichaelKjörling — это удалит все файлы, начинающиеся с u или p, а не только файлы с именами u и p. Я думаю, что ОП (@Ashot) имел в виду az и u, p и т. Д. символически, а не буквально.

@HobbesofCalvin Это приведет к удалению всех файлов, не начинающихся с u или p, а не тех, которые начинаются с них.

Делаем это без поиска:

(Правка: "u" и "v", как и в других местах здесь, используются как универсальные версии целых регулярных выражений. Очевидно, вы должны быть осторожны, чтобы привязывать свои регулярные выражения, чтобы избежать совпадения слишком многих вещей.)

Вам определенно понадобится сценарий, если вы собираетесь делать большую часть этого, как предлагали другие.

@Matteo Нет, не будет. Grep не ищет файлы, он ищет вывод команды ls. Вы думаете о чем-то вроде grep -L (u|p)' * | xargs rm, где -L означает список имен файлов, не содержащих совпадений.

О, вы имеете в виду любой файл, имя которого содержит u или p , а не любой файл, содержащий u или p . Это верно. Вы можете исправить это, используя egrep -v '^(u|p)$'

Второй будет работать, даже если у вас есть ^ в $histchars для подстановки истории, и, конечно, вы можете поместить произвольный глобус перед ~ .

GLOBIGNORE принимает список, разделенный двоеточиями

Это не работает в моей оболочке (GNU bash 4.1.5(1)). Не забудьте сначала протестировать его с чем-то менее опасным, чем rm, или в тестовом каталоге!

Во времена дискет у меня был исполняемый файл DOS под названием «Except», который временно перемещал объекты из текущего каталога и выполнял команду, так что вы могли сказать:

чтобы удалить все, кроме ваших текстовых файлов.

Это довольно тривиальная вещь для реализации в виде скрипта оболочки, и если это то, что вы, вероятно, будете делать более двух раз, кажется, что это будет хорошей идеей.

Это напомнило мне то же самое. Но временное перемещение из папки может быть не очень хорошей идеей в эпоху многозадачности :)

Это удалит все файлы, кроме u и p в unix


Для тех, кто предпочитает указывать произвольные сложные шаблоны исключения (охватывающие все затронутые имена файлов) в полномасштабном стиле regexp emacs, posix-awk или posix-extended (см. справочную страницу поиска), я бы порекомендовал этот. В этом примере он исключает u и p в текущем каталоге. Это может быть удобно для скриптов.


нет - моя версия поиска (debian сжатия) определенно не требует явного указания каталога перед выражением, если следует использовать текущий каталог

Допустим, у вас есть более 100 файлов в папке. Вы хотите удалить их все, кроме одного или нескольких конкретных файлов. Как бы вы это сделали? Вы можете скопировать файлы, которые хотите сохранить, и сохранить их в другом месте, а затем удалить остальные файлы или всю папку. Но подождите, я знаю самый простой способ сделать это. Вы можете удалить все файлы в более старой версии, кроме одного конкретного файла или файлов определенного типа, за один раз с помощью однострочной команды. Хотите знать, как? Читайте дальше.

Удалить все файлы в папке, кроме одного определенного файла

Представим следующий пример. У нас есть папка под названием «тест», содержащая 10 текстовых файлов.

Теперь я хочу удалить в этой папке все, кроме файла 10.txt.

Для этого может быть много команд. Но это пять команд, о которых я знаю.

Сначала перейдите в тестовую папку:

И выполните следующую команду:

Приведенная выше команда удалит все файлы в тестовой папке, кроме файла file10.txt.

Вы также можете использовать команду find, чтобы удалить все, кроме определенного. Следующая команда удалит все файлы в текущей папке (т. е. в нашем случае test), кроме файла 10.txt.

Как видно из приведенного выше примера, тестовая папка содержит файлы того же типа, то есть файлы .txt. Что бы вы сделали, если бы в папке были файлы разных типов, такие как .mp3, .doc, .pdf и т. д.? Также легко хранить определенные типы файлов в папке и удалять все остальные.

Допустим, наша тестовая папка содержит три файла .txt, три файла .mp3, три файла .doc и один файл .pdf.

Пример вывода:

Как и в приведенном выше выводе, у меня есть четыре разных типа файлов (pdf, txt, mp3, doc) в тестовой папке. Я хотел бы сохранить файлы с расширением .doc и удалить все остальное. Вот как я могу это сделать:

Теперь давайте перечислим содержимое файла с помощью команды:

Пример вывода:

Приведенная выше команда удаляет все в папке, кроме файлов с расширением .doc.

Точно так же вы можете сохранить два или более определенных типа файлов и удалить все остальное. Например, следующая команда сохранит файлы с расширениями .doc и .mp3.

Теперь вы увидите, что файлы mp3 и doc не удалены.

Пример вывода:

Это всего лишь десять разных типов файлов. Просто представьте, что у вас есть сотни файлов. Было бы сложнее найти каждый тип файлов и удалить их вручную. Этот трюк сделает всю работу всего за одну-две секунды.

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

Рекомендуемое чтение:

Надеюсь, это поможет. Если вы считаете это руководство полезным, поделитесь им в социальных сетях и профессиональных сетях и поддержите нас.

Читайте также: