Использование find - удаление всех файлов / каталогов (в Linux), кроме любого - PullRequest
14 голосов
/ 14 апреля 2011

Если мы хотим удалить все файлы и каталоги, которые мы используем, rm -rf *.

Но что, если я хочу, чтобы все файлы и каталоги были удалены сразу, кроме одного конкретного файла?

Есть ли какая-либо команда для этого?rm -rf * упрощает удаление одним выстрелом, но удаляет даже мой любимый файл / каталог.

Заранее спасибо

Ответы [ 11 ]

30 голосов
/ 14 апреля 2011

find может быть очень хорошим другом:

$ ls
a/  b/  c/
$ find * -maxdepth 0 -name 'b' -prune -o -exec rm -rf '{}' ';'
$ ls
b/
$ 

Объяснение:

  • find * -maxdepth 0: выбрать все, что выбрано* без перехода в какие-либо каталоги

  • -name 'b' -prune: не беспокоить (-prune) чем-либо, что соответствует условию -name 'b'

  • -o -exec rm -rf '{}' ';': позвоните rm -rf для всего остального

Кстати, другим, возможно, более простым способом было бы переместить или переименовать ваш любимый каталог, чтобы он не мешал:

$ ls
a/  b/  c/
$ mv b .b
$ ls
a/  c/
$ rm -rf *
$ mv .b b
$ ls
b/
9 голосов
/ 09 августа 2013

Краткий ответ

ls | grep -v "z.txt" | xargs rm

Подробности :

Процесс обработки вышеуказанной команды:

  • Список всех файлов (ls)
  • Игнорировать один файл с именем "z.txt" (grep -v "z.txt")
  • Удалить перечисленные файлы, кроме z.txt (xargs)rm)

Пример

Создать 5 файлов, как показано ниже:

echo "a.txt b.txt c.txt d.txt z.txt" | xargs touch

Список всех файлов, кроме z.txt

ls|grep -v "z.txt"

a.txt
b.txt
c.txt
d.txt

Теперь мы можем удалить (rm) перечисленные файлы с помощью утилиты xargs :

ls|grep -v "z.txt"|xargs rm
2 голосов
/ 22 июня 2012

хотя бы в зш

rm -rf ^filename

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

2 голосов
/ 14 апреля 2011

Вы можете ввести его прямо в командной строке или использовать это нажатие клавиши в скрипте

files=`ls -l | grep -v "my_favorite_dir"`; for file in $files; do rm -rvf $file; done

PS Я предлагаю -i переключиться на rm, чтобы предотвратить удаление важных данных.

PPS Вы можете написать небольшой скрипт на основе этого решения и поместить его в /usr/bin (например, /usr/bin/rmf).Теперь вы можете использовать его как и обычное приложение:

rmf my_favorite_dir

Сценарий выглядит так (просто набросок):

#!/bin/sh

if [[ -z $1 ]]; then
    files=`ls -l`
else
    files=`ls -l | grep -v $1`
fi;

for file in $files; do
    rm -rvi $file
done;
1 голос
/ 31 июля 2012

В bash у вас есть оператор глобуса !(), который инвертирует сопоставленный шаблон. Таким образом, чтобы удалить все, кроме файла my_file_name.txt, попробуйте это:

shopt -s extglob
rm -f !(my_file_name.txt)

См. Эту статью для более подробной информации: http://karper.wordpress.com/2010/11/17/deleting-all-files-in-a-directory-with-exceptions/

1 голос
/ 14 апреля 2011

Если это всего лишь один файл, один простой способ - переместить этот файл в /tmp или что-то еще, rm -Rf каталог, а затем переместить его обратно.Вы можете назвать это простой командой.

Другой вариант - сделать find и затем grep, что вам не нужно (используя -v или напрямую используя один из предикатов find s), а затем rm ingостальные файлы.

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

0 голосов
/ 21 сентября 2016
cd ..
ln trash/useful.file ./
rm -rf trash/*
mv useful.file trash/
0 голосов
/ 09 августа 2013
mv subdir/preciousfile  ./
rm -rf subdir
mkdir subdir
mv preciousfile subdir/

Это выглядит утомительно, но довольно безопасно

  • избегает сложной логики
  • никогда не использует rm -rf *, его результаты зависят от вашего текущего каталога (который может быть/; -)
  • никогда не использовать глобирование *: его расширение ограничено ARGV_MAX.
  • позволяет проверять ошибку после каждой команды и, возможно, избежать аварии, вызваннойследующая команда.
  • позволяет избежать неприятных проблем, вызванных пробелами или NL в именах файлов.
0 голосов
/ 16 декабря 2012

Я вижу здесь много длинных средств, которые работают, но с / b / c / d / e /

 rm -rf *.* !(b*) 

это удаляет все, кроме каталога b / и его содержимого (при условии, что ваш файлнаходится в b /. Затем просто cd b / и

rm -rf *.* !(filename) 

, чтобы удалить все остальное, кроме файла (с именем "filename"), который вы хотите сохранить.

0 голосов
/ 14 апреля 2011

Я не знаю такой программы, но несколько раз хотел ее в прошлом.Основной синтаксис:

IFS='
' for f in $(except "*.c" "*.h" -- *); do
  printf '%s\n' "$f"
done

В программе, которую я имею в виду, есть три режима:

  • точное соответствие (с параметром -e)
  • glob сопоставление (по умолчанию, как показано в примере выше)
  • сопоставление регулярному выражению (с параметром -r)

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

Такая программа не должна быть трудной для написания, как в C, так и в ShellКомандный язык.И это хороший пример для изучения основ Unix.Когда вы делаете это как программа-оболочка, вам, конечно, нужно искать имена файлов, содержащие пробелы и другие специальные символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...