Shell script: Как удалить все файлы в каталоге, кроме перечисленных в файле?

У меня есть каталог (~/temp/), который содержит много файлов и подкаталогов, а в некоторых каталогах они могут содержать другие файлы и подкаталоги. Кроме того, в каталоге (~/temp/) он содержит специальный txt файл с именем kept.txt, он перечисляет некоторые прямые файлы и подкаталоги, которые содержатся в ~/temp/, теперь я хочу удалить все остальные файлы и каталоги в ~/temp/, которые не указаны в файле kept.txt, как это сделать с помощью команды оболочки, тем проще.

например.

Каталог нравится, как показано ниже:

$ tree temp/ -F
temp/
 ├── a/
 ├── b/
 ├── c/
 │   ├── f2.txt
 │   └── z/
 ├── f1.txt
 └── kept.txt

Содержимое kept.txt:

$ more kept.txt
b
kept.txt

В этом случае:

  • Я хочу удалить a/, c/ и f1.txt. Для c/ сам каталог и весь суб контент (файлы и каталоги) будут удалены.
  • В kept.txt формат - это один элемент (файл или каталог) в строке.
2 ответа

Используя extglob, вы можете сделать это:

cd temp
shopt -s extglob
rm -rf !($(printf "%s|" $(
<p> <code>printf "%s|" $(<kept.txt)< code=""> будет предоставлять вывод как <code>b|kept.txt|, а !(...) - это расширенный шаблон glob, чтобы отрицать соответствие.


Переместите все во временную папку. Переместите файлы/каталоги, перечисленные в .txt. Затем, наконец, удалите временную папку.

licensed under cc by-sa 3.0 with attribution.