Как удалить всех кроме одного файла в Unix? [дубликат]

Возможный дубликат:
Как удалить все файлы в каталоге кроме некоторых?

Как удалить всех кроме одного (или некоторые) файл в Unix?

Что-то как

 rm -rf -ignore myfile.txt *
13
задан 09.05.2017, 22:03

5 ответов

ls * | grep -v dont_delete_this_file | xargs rm -rf 

Пример:

mkdir test && cd test
touch test1
touch test2
touch test3
touch test4
touch test5

Удалить все файлы кроме 'test2':

ls * | grep -v test2 | xargs rm -rf

Затем вывод 'ls':

test2

Править:

Спасибо за комментарий. Если каталог содержит некоторые файлы с пробелами:

mkdir test && cd test
touch "test 1"
touch "test 2"
touch "test 3"
touch "test 4"
touch "test 5"

Можно использовать (с ударом):

rm !("test 1"|"test 4")

'ls' производят:

test 1
test 4
20
ответ дан 07.12.2019, 11:29

Принятие Вас использует оболочку удара (наиболее распространенный случай), можно использовать отрицание globbing (расширение пути) символ:

rm -rf !(myfile.txt)

Это использует расширенный globbing, таким образом, необходимо было бы включить это сначала:

shopt -s extglob
8
ответ дан 07.12.2019, 11:29
 cp myfile.txt somewhere_else;
 rm -rf *
 cp somewhere_else/myfile.txt .
1
ответ дан 07.12.2019, 11:29

Эта страница дает множество опций в зависимости от оболочки: http://www.unix.com/unix-dummies-questions-answers/51400-how-remove-all-except-one-file.html

0
ответ дан 07.12.2019, 11:29

Для рекурсивного rm необходимо было бы сделать рекурсию с find и исключите файл (файлы), который Вы хотели сохранить (или grep, но это может получить Вас в пробельную проблему). Для шарика оболочки современные оболочки имеют шаблоны шарика, которые могут использоваться для исключения файлов; это может быть объединено с рекурсией шарика уровня оболочки когда доступный (например. zsh имеет rm **/*~foo/bar — обратите внимание, что это, вероятно, столкнется с пределами длины аргумента для больших деревьев каталогов).

0
ответ дан 07.12.2019, 11:29

Теги

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