Удалите все файлы / каталоги, за исключением одного файла

У меня есть каталог, содержащий большое количество файлов. Я хочу удалить все файлы, кроме file.txt. Как это сделать?

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

Кто-то предложил использовать

  rm! (file.txt)
 

Но это не сработает. Он возвращает:

  Неполадки ()
 

Моя ОС - это Scientific Linux 6.

Любые идеи?

182 голоса | спросил Derek 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 05:59:42 +0400 2014, 05:59:42

4 ответа


224

POSIXly:

  find. ! -name 'file.txt' -type f -exec rm -f {} +
 

удалит все обычные файлы (рекурсивно, включая скрытые), кроме file.txt . Чтобы удалить каталоги, измените -type f на -type d и добавьте параметр -r в rm .

В bash , чтобы использовать rm -! (file.txt) , вы должны enable extglob :

  $ shopt -s extglob
$ rm -! (file.txt)
 

(или вызов bash -O extglob )

Обратите внимание, что extglob работает только в bash и семействе оболочек Korn. И использование rm -! (File.txt) может вызвать слишком длинный <Аргумент> Ошибка .

В zsh вы можете использовать ^ , чтобы скрыть шаблон с помощью extendedglob включен:

  $ setopt extendedglob
$ rm - ^ file.txt
 

или используя тот же синтаксис с ksh и bash с параметрами ksh_glob и no_bare_glob_qual .

ответил cuonglm 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 06:02:31 +0400 2014, 06:02:31
86

Другое направление в другом направлении (если в именах файлов нет пробелов)

  ls | grep -v file.txt | xargs rm
 

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

  ls | grep -v file.txt | параллельный rm
 

из man grep :

  -v, -invert-match
          Инвертируйте смысл соответствия, чтобы выбрать несогласованные строки. (-v задается POSIX)
 
ответил Sebastian 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 06 Sep 2014 13:49:59 +0400 2014, 13:49:59
25

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

  {rm -rf *
    tar -x
} <TAR
$ (tar -c $ one_file)
TAR
 

В одной строке:

  {rm -rf *; tar -x; } <$ (tar -c $ one_file)
 

Но для этого требуется оболочка, которая поддерживает здесь-строки.

ответил mikeserv 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 06:33:13 +0400 2014, 06:33:13
14

На моей Scientific Linux 6 OS это работает:

  shopt -s extglob
rm! (file.txt)
 

У меня также установлен Debian 32bit на виртуальной машине. Вышеупомянутое не работает, но следующее:

  find. Тип f! -name 'file.txt' -delete
 
ответил Derek 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 05 Sep 2014 06:27:32 +0400 2014, 06:27:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132