Мой каталог верхнего уровня data
. data
включает в себя несколько каталогов, и эти каталоги имеют подкаталоги. Мне нужно удалить все файлы и каталоги внутри, data/
кроме нескольких файлов в некоторых каталогах.
Например, данные включают в себя каталоги 100
и 101
. Я просто хочу сохранить a.txt
и b.txt
файлы в 100/
и c.txt
и d.txt
файлы 101/
при удалении всех других файлов и каталогов в 100
и 101
.
Пример:
.
├── 100
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── d.txt
└── 101
├── a.txt
├── b.txt
├── c.txt
└── d.txt
Я использую rm -rf !(a.txt|b.txt)
команду, но не могу применить эту команду для каждого каталога автоматически.
источник
rm
знать, какие файлы хранить в каких каталогах, если вы не хотите это указывать.Вы могли бы использовать
find
для этого. Вы можете отменить тестыfind
с помощью-not
или!
. Это исключит совпадения, а не их поиск.Вы должны быть осторожны, чтобы не удалить ни один из родительских каталогов файлов, которые вы хотите сохранить, особенно текущий каталог
.
, поэтому убедитесь, что вы внимательно прочитали вывод перед удалением.На основании вашего примера вы можете сделать что-то подобное из
data
каталога.Добавьте
! -path ./path/to/dir
для любого пути, который вы хотите избежать. Вы можете использовать метасимволы как*
, но убедитесь, что вы цитируете выражение, если вы делаете, например"./path*dir"
, чтобы предотвратить любые нежелательные расширения.find
является рекурсивным по умолчанию. Даже если мы не найдем./100
здесь, мы найдем все его содержимое, если они не соответствуют шаблону[ab].txt
. Если вы не можете сопоставить все имена, которые хотите сохранить, добавьте еще один тест:Это не найдет
a.txt
илиb.txt
илиfoo
, но он найдет все другие файлы.Когда вы уверены, что видите, что хотите, вы можете добавить
-delete
в конец, чтобы удалить найденные файлы:источник