2

Это была старая проблема. Я знал, как удалить файлы и исключить некоторые, как это:

rm `find ~/temporary/Test\ 1 -mindepth 1 -maxdepth 1|grep -v 'A'`

но проблема в том, что папка «Test 1» содержит пробел в имени, результат поиска был

/home/owner/temporary/Test 1/B

Это делает ошибку rm , как я могу это исправить?

2 ответа2

1

Это решение работает даже с пробелами, но требует некоторого набора:

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -exec rm {} \+

Или с более новыми версиями find (findutils> = 4.2.3):

find -mindepth 1 -maxdepth 1 ! -name "peter" ! -name "paul & mary" -delete
1

Вот мое взятие:

$ mkdir -p temp\ 1/sub\ 1
$ touch temp\ 1/{one,two,three} temp\ 1/sub\ 1/{one,two,three}
$ tree temp\ 1/
temp\ 1/
├── one
├── sub\ 1
│   ├── one
│   ├── three
│   └── two
├── three
└── two

1 directory, 6 files
$ find temp\ 1/ -maxdepth 1 -mindepth 1 -type f ! -regex '.*/.*o.*' -exec rm -v {} \;
removed ‘temp 1/three’

Итак, ключевые понятия здесь:

  1. Фильтр -regex с отрицанием (! параметр before) и шаблон, который применяется ко всему пути найденного файла.
  2. Команда -exec , в которой токен {} заменен на правильный путь в кавычках. Не забудьте добавить \; чтобы отметить конец командной строки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .