Как я рекурсивно удаляю подкаталоги и файлы, но не первый родительский каталог?

Я могу использовать следующее, чтобы удалить целевой каталог и рекурсивно все его подкаталоги и содержимое.

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

Однако я не хочу, чтобы целевой каталог был удален. Как удалить только файлы в целевом, подкаталоге и их содержимом?

9 голосов | спросил Michael Prescott 11 FebruaryEurope/MoscowbThu, 11 Feb 2010 17:34:32 +0300000000pmThu, 11 Feb 2010 17:34:32 +030010 2010, 17:34:32

3 ответа


11

Предыдущий ответ почти правильный. Однако вы не должны приводить символы оболочки оболочки , если вы хотите, чтобы они Работа. Итак, это команда, которую вы ищете:

rm -rf "/target/directory with spaces/"*

Обратите внимание, что * находится вне двойных кавычек. Эта форма также будет работать:

rm -rf /target/directory\ with\ spaces/*

Если у вас есть код * в кавычках, как показано выше, то он попытается удалить только один файл с буквальным именем * внутри целевого каталога.

ответил pioto 13 FebruaryEurope/MoscowbSat, 13 Feb 2010 08:34:32 +0300000000amSat, 13 Feb 2010 08:34:32 +030010 2010, 08:34:32
7

Еще три варианта.

  1. Используйте find с помощью -mindepth 1 и -delete:

      

    -месячные уровни
      Не применяйте никаких тестов или действий на уровнях ниже уровней (неотрицательное целое число).
      -Mindepth 1 означает обработку всех файлов, кроме аргументов командной строки.

         

    -delete
      Удалить файлы; true, если удаление удалось. Если удаление не удалось, выдается сообщение об ошибке.   Если -delete не удается, статус выхода будет отличным от нуля (когда он в конечном итоге выйдет). Использование   -Delete автоматически включает параметр -depth.
    Перед использованием этой опции тщательно проверьте параметр -depth.

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. Используйте find, но с файлами, а не с каталогами. Это позволяет избежать необходимости rm -rf:

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. Перейдите и удалите родительский каталог, но заново создайте его. Вы можете создать функцию bash, чтобы сделать это с помощью одной команды; вот простой однострочный:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'
ответил quack quixote 13 FebruaryEurope/MoscowbSat, 13 Feb 2010 10:03:07 +0300000000amSat, 13 Feb 2010 10:03:07 +030010 2010, 10:03:07
2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
ответил Sergey 13 FebruaryEurope/MoscowbSat, 13 Feb 2010 09:37:44 +0300000000amSat, 13 Feb 2010 09:37:44 +030010 2010, 09:37:44

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132