Mój katalog najwyższego poziomu to data
. data
zawiera kilka katalogów i te katalogi mają podkatalogi. Muszę usunąć wszystkie pliki i katalogi wewnątrz, data/
z wyjątkiem kilku plików w niektórych katalogach.
Na przykład dane obejmują katalogi 100
i 101
. Chcę tylko zachować a.txt
i b.txt
pliki w 100/
i c.txt
i d.txt
pliki w 101/
podczas usuwania wszystkich innych plików i katalogów w 100
i 101
.
Przykład:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
Korzystam z rm -rf !(a.txt|b.txt)
polecenia, ale nie mogę zastosować go automatycznie do każdego katalogu.
źródło
rm
należy wiedzieć, które pliki przechowywać w których katalogach, jeśli nie chcesz tego określać.Możesz
find
do tego użyć . Możesz zanegować testy zafind
pomocą-not
lub!
. Spowoduje to wykluczenie dopasowań zamiast ich znajdowania.Należy uważać, aby nie usunąć żadnego z nadrzędnych katalogów plików, które chcesz zachować, zwłaszcza bieżącego katalogu
.
, więc upewnij się, że dokładnie przeczytałeś dane wyjściowe przed usunięciem.Na podstawie twojego przykładu możesz zrobić coś takiego z
data
katalogu.Dodaj
! -path ./path/to/dir
dowolną ścieżkę, której chcesz uniknąć. Możesz używać metaznaków, takich jak*
, ale pamiętaj o zacytowaniu wyrażenia, jeśli tak zrobisz, np."./path*dir"
Aby zapobiec niepożądanym rozszerzeniom.find
jest domyślnie rekurencyjny. Nawet jeśli nie znajdziemy./100
tutaj, znajdziemy całą jego zawartość, chyba że pasują do wzorca[ab].txt
. Jeśli nie możesz dopasować wszystkich nazw, które chcesz zachować, dodaj kolejny test:To nie znajdzie
a.txt
albob.txt
albofoo
, ale znajdzie wszystkie inne pliki.Gdy jesteś pewien, że widzisz, co chcesz, możesz dodać
-delete
na końcu, aby usunąć znalezione pliki:źródło