Удалить все файлы в Parent кроме одного

В системе, основанной на Debian -, пуленепробиваемым -способом определения архитектуры, подходящей для использования в имени файла пакета, является

dpkg --print-architecture

Обратите внимание, что пакеты, независимые от архитектуры -, используют здесь all, и вы должны знать это заранее.

0
28.11.2020, 12:34
2 ответа

Предполагая, что вы используете оболочку bash:

shopt -s dotglob extglob
rm -rf../../!(child1)

Здесь команда shoptвключает две опции оболочки в оболочке bash. Первый, dotglob, гарантирует, что скрытые имена будут соответствовать шаблонам подстановки имен файлов. Второй, extglob, позволяет использовать некоторые расширенные шаблоны подстановки (, исходные из оболочки ksh).

Во второй строке используется расширенный шаблон подстановки для соответствия всем именам в каталоге parent, кроме имени child1. Содержимое каталога parentнаходится на два уровня выше нас, поэтому мы сначала используем ../../, а затем добавляем шаблон !(child1), который будет соответствовать всем именам, кроме имени child1.

Все совпадающие имена передаются в rm -rfдля (рекурсивного )удаления.

Вместо использования относительного пути в шаблоне ../../!(child1)вы также можете использовать абсолютный путь к каталогу parent.Согласно вашему вопросу, абсолютный путь - /parent, поэтому вместо этого шаблон становится /parent/!(child1). Использование абсолютного пути может быть безопаснее, если вы не уверены, где вы на самом деле находитесь относительно каталога parent.


Еще один очевидный способ решить эту проблему — сначала убрать каталог child1, удалить и заново создать каталог parent, а затем снова переместить каталог child1на место.

Здесь я использую абсолютные пути (использование относительных путей может привести к путанице, так как мы перемещаем наш текущий каталог относительноparent):

mv /parent/child1 /tmp
rm -rf /parent
mkdir /parent
mv /tmp/child1 /parent
2
18.03.2021, 22:46

Если у вас есть GNU find, вы можете использовать эту команду

find../.. -depth -not -path "../../child1/*" -not -samefile../.. -not -samefile../../child1 -exec rm -r {} \;

Просто убедитесь, что вы действительно находитесь внутри/parent/child1/child2

0
18.03.2021, 22:46

Теги

Похожие вопросы