Мне нужно удалить все папки внутри папки, используя ежедневный скрипт. Папку на этот день нужно оставить.
Папка «myfolder» имеет 3 подпапки: «test1», «test2» и «test3». Мне нужно удалить все, кроме «test2».
Я пытаюсь найти точное имя здесь:
find /home/myfolder -type d ! -name 'test2' | xargs rm -rf
ИЛИ
find /home/myfolder -type d ! -name 'test2' -delete
Эта команда всегда пытается удалить основную папку «myfolder»! Есть ли способ избежать этого?
!
оператор:\!
или'!'
.Ответы:
Это удалит все папки внутри,
./myfolder
кроме этого,./myfolder/test2
и все его содержимое будет сохранено:Как это устроено
find
запускает команду поиска./myfolder
говорит find начать с каталога./myfolder
и его содержимого.-mindepth 1
не соответствует./myfolder
самому себе, только файлы и каталоги под ним.! -regex '^./myfolder/test2\(/.*\)?'
говорит find для exclude (!
) любой файл или каталог, соответствующий регулярному выражению^./myfolder/test2\(/.*\)?
.^
соответствует началу имени пути. Выражение(/.*\)?
соответствует либо (a) косой черте, за которой следует что-либо, либо (b) вообще ничего.-delete
говорит find для удаления соответствующих (то есть, не исключенных) файлов.пример
Рассмотрим структуру каталогов, которая выглядит следующим образом;
Мы можем запустить команду find (без
-delete
), чтобы увидеть, что она соответствует:Мы можем убедиться, что это сработало, посмотрев на файлы, которые остались:
источник
-prune
оставитьtest2/*/
подкаталоги в покое: вернутьсяrm -r
и добавить-maxdepth 1
../myfolder
. Вам нужно пропустить (IMvhO) только-type d
для каталогов .find ./myfolder -depth -mindepth 1 -maxdepth 1 -type d ! -regex '^./myfolder/test2\(/.*\)?'
Используя bash :
Пример:
источник
ТЛ; др
Удалите эхо, если удовлетворены списком файлов.
Использование
-mindepth 1
гарантирует, что верхний каталог не выбран.Но
-not -name test2
будет не избежать подкаталогов внутриtest2
:Для этого вам нужно что-то вроде чернослива:
Но не используйте
delete
, как это подразумевается,depth
и это начнет стираться с самого длинного пути:Либо используйте
rm -rf
(удалите,echo
если вы действительно хотите стереть):Или, также используйте,
maxdepth
если все, что вам нужно, это удалить каталоги (и все внутри) (удалить,echo
чтобы фактически стереть):A
-delete
все равно не будет работать, если каталог не пустой:источник
Если вы используете zsh, вы можете:
источник
Протестировано с приведенной ниже командой, и она работала нормально
источник
-mindepth 1
) делает этот верхний каталог соответствующим всем критериям (это каталог, и он не называется «test2»), и поэтому он удаляется.