2015-09-02 16 views
6

Mam katalog (~/temp/), który zawiera wiele plików i podkatalogów, aw niektórych katalogach mogą zawierać inne pliki i podkatalogi. Ponadto w katalogu (~/temp/) znajduje się specjalny plik txt o nazwie kept.txt, lista niektórych plików i podkatalogów bezpośrednich zawartych w ~/temp/, teraz chcę usunąć wszystkie inne pliki i katalogi pod ~/temp/, które nie są wymienione w plik kept.txt, jak to zrobić za pomocą polecenia powłoki, tym prostsze, tym lepiej.Skrypt powłoki: jak usunąć wszystkie pliki w katalogu, z wyjątkiem tych wymienionych w pliku?

np.

Katalog lubi jak poniżej:

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

Zawartość kept.txt jest:

$ more kept.txt 
b 
kept.txt 

W tym przypadku:

  1. chcę usunąć a/, c/ i f1.txt. W przypadku c/ sam katalog i wszystkie treści podrzędne (pliki i katalogi) zostaną usunięte.
  2. W formacie kept.txt formatem jest jeden element (plik lub katalog) na linię.

Odpowiedz

3

Korzystanie extglob można to zrobić:

cd temp 
shopt -s extglob 

rm -rf !($(printf "%s|" $(<kept.txt))) 

printf "%s|" $(<kept.txt) zapewni wyjście jako b|kept.txt| i !(...) jest extended glob pattern negować mecz.

+0

Poza tym usunie również 'keep.txt'. – cdarke

+0

Nie to nie usunie, ponieważ OP ma również wiersz 'keep.txt' w pliku' kept.txt'. – anubhava

+0

Przepuściłem to, przepraszam. (czy to było na edytowanie?) – cdarke

1

Przenieś wszystko do folderu tymczasowego. Wróć do plików/katalogów wymienionych w pliku .txt. Następnie, na końcu, usuń folder tymczasowy.

+1

Tak, jest to prosty dobry sposób na rozwiązanie tego problemu, ale nie jestem pewien, czy jest jakieś proste polecenie, aby to zrobić. – manshou

Powiązane problemy