Удаление всех файлов в папке кроме файлов X, Y и Z

Существует большой поток об этом на форумах Ubuntu. Ole J предлагает следующую функцию определения завершения псевдонима:

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

Используйте его для определения функции завершения для псевдонима, затем укажите что функция как completer для псевдонима:

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

Я предпочитаю использовать псевдонимы для добавления всегда используемых аргументов существующим программам. Например, с grep, Я всегда хочу пропустить устройства и двоичные файлы, таким образом, я делаю псевдоним для grep. Для добавления новых команд такой как grepbin, Я использую сценарий оболочки в моем ~/bin папка. Если та папка будет в Вашем пути, то она будет автоматически заполнена.

17
11.02.2011, 05:22
7 ответов

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

find . \! -name 'file' -delete

Много версий должны смочь поддерживать соответствие регулярного выражения и globbing.

Вы могли также передать вывод по каналу находки к комнате также

find . \! -name '*pattern*' -print0 | xargs --null rm 
16
27.01.2020, 19:46
  • 1
    И это позволяет Вам видеть точно, что файлы будут удалены путем удаления -delete а также что файлы будут сохранены путем удаления -delete и \!. –  Shawn J. Goff 11.02.2011, 02:51
  • 2
    , find является рекурсивным! таким образом, все подкаталоги файлов, не соответствующие 'шаблону', будут удалены также –  Alexandre Holden Daly 24.06.2014, 01:07
  • 3
    Путь через потребности xargs - глубина, для предотвращения попытки удаления каталогов, прежде чем файлы включали в них. Однако я думаю, что комната не удалит каталоги также. –  user unknown 14.09.2017, 00:24

Используя zsh, с setopt EXTENDED_GLOB, использование ~ оператор (кроме)

rm -- *~(x|y|z)

или ^ оператор (отрицание):

rm -- ^(x|y|z)

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

9
27.01.2020, 19:46

Более поздние версии удара имеют extglob опция оболочки, которая дает Вам синтаксис для того, чтобы сделать то, что Вы хотите (проверяют Вашу страницу справочника при "Расширении Пути", чтобы видеть, имеет ли Ваша установленная версия его):

$ shopt -s extglob  # turn on extended globbing
$ rm !(X|Y|Z)

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

5
27.01.2020, 19:46
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r

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

Если имена файлов более сложны затем, что, сделать

ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r

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

Эта версия - как предложено в комментариях - сохраняет некоторые символы и выглядит немного более ясной.

ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
5
27.01.2020, 19:46
  • 1
    предложенное редактирование ddeimeke должен измениться egrep аргумент "^(file1|filename2|f1le)$" –  Michael Mrozek♦ 12.02.2011, 00:37
  • 2
    Если у Вас есть три файла a, b и a b первая программа удалит - при помещении ab в grep часть: "^[ab]$" a и b но нет a b, просто настроенный против Ваших намерений. Вторая команда сделает то же. И третье также. Вы не должны использовать 'ls' в сценариях, с очень, очень редкие исключения. Просто не делайте этого. –  user unknown 12.03.2011, 04:17

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

3
27.01.2020, 19:46
  • 1
    Интересно почему минус?.. Это на самом деле и легче и более безопасно, чем что-либо предложенное другими: Вы просто не можете выстрелить себе в ногу путем удара некоторого специального символа в имени файла. –  alex 11.02.2011, 10:34
  • 2
    a) Вы перемещаете свой файл X один каталог, где файл X существует - тихо удаленный, уведенный. b) Вы находитесь в главном dir, где не существует. c) Вы находитесь в своем доме и не имеете разрешения записать в / домой. Если Вы помещаете свой совет в сценарий и протестировали его без проблемы, и используйте его в такой ситуации - peng! –  user unknown 12.03.2011, 04:38
  • 3
    a) Эй, я говорил 'файлы перемещения один уровень'? Я сказал, отодвигают их. b), Таким образом, Вы пытаетесь удалить все файлы в /, heh? Не очень практичный. c), Пытающийся удалить все файлы в Вашем $HOME не действительно практично также. –  alex 12.03.2011, 08:48
  • 4
    Вы правы, я сожалею. –  user unknown 12.03.2011, 09:14

С находкой GNU можно использовать - удаляют переключатель, который удаляет каталоги, если пустой, также:

 find tmp -not -name X -not -name Y -not -name Z -delete 
0
27.01.2020, 19:46
  • 1
    Если X, Y или Z будет каталог, то это удалит файлы в них также. find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete один путь состоит в том, чтобы работать вокруг этого. –  Gilles 'SO- stop being evil' 12.03.2011, 03:00
  • 2
    Since под Unix являются файлами (что-либо - файл), это, возможно, что предназначается. Вопрос явно говорит: "У меня есть много файлов и папок в определенной папке, и я хочу удалить всех их"; - и если Вам нравится исключать Y, возможно, Вы знаете, является ли Y каталогом или нет. –  user unknown 12.03.2011, 03:37
  • 3
    , Который закончит тем, что удалил tmp также, если было нет X/Y/Z файлы в нем.Примечание: ! как стандартный эквивалент GNU -not (-delete также расширение GNU) –  Stéphane Chazelas 13.09.2017, 15:32
  • 4
    @StéphaneChazelas: От вопроса, удаляя папки (все они) то, относительно чего попросили. Так как удару нужно маскирование, я предпочитаю вводить - нет. Мог бы зависеть от немецкой раскладки клавиатуры, где Обратной косой черте нужен Alt-Gr. –  user unknown 14.09.2017, 00:20

Будет удалено все (, включая скрытые ), за исключением выбранных файлов/папок в ТЕКУЩЕМ каталоге.

find. -maxdepth 1 ! -name "file1.php" ! -name "file2.js" ! -name "dir1" ! -name "dir2" ! -name. -exec rm -r {} \;
2
14.08.2020, 18:13

Теги

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