Como faço para remover recursivamente subdiretórios e arquivos, mas não o primeiro diretório pai?

9

Eu sou capaz de usar o seguinte para remover o diretório de destino e recursivamente todos os seus subdiretórios e conteúdos.

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

No entanto, não quero que o diretório de destino seja removido. Como posso remover apenas os arquivos no destino, os subdiretórios e seu conteúdo?

    
por Michael Prescott 11.02.2010 / 15:34

4 respostas

11

A resposta anterior está quase correta. No entanto, você não deve citar os caracteres glob glob se quiser que eles funcionem. Então, este é o comando que você está procurando:

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

Observe que o * está fora das aspas duplas. Este formulário também funcionaria:

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

Se você tiver o * entre aspas, conforme mostrado acima, ele tentará remover apenas o arquivo único chamado literalmente * dentro do diretório de destino.

    
por 13.02.2010 / 06:34
7

Mais três opções.

  1. Use find com -mindepth 1 e -delete :

    −mindepth levels
    Do not apply any tests or actions at levels less than levels (a non‐negative integer).
    −mindepth 1 means process all files except the command line arguments.

    -delete
    Delete files; true if removal succeeded. If the removal failed, an error message is issued. If −delete fails, find’s exit status will be nonzero (when it eventually exits). Use of −delete automatically turns on the −depth option.
    Test carefully with the -depth option before using this option.

    # 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. Use find , mas com arquivos, não diretórios. Isso evita a necessidade de 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. Vá em frente e remova o diretório pai, mas recrie-o. Você poderia criar uma função bash para fazer isso com um comando; aqui está um simples one-liner:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'
    
por 13.02.2010 / 08:03
2

Que tal

rm -rf /target/directory\ path/*

Se houver arquivos começando com. no diretório de destino.

rm -rf "/target/directory path/*" "/target/directory path/.??*"

Este segundo vai combinar tudo começando com a., exceto. e .. Ele falhará em nomes como .a, mas isso não é muito comum. Poderia ser ajustado, se necessário, para cobrir todos os casos.

    
por 11.02.2010 / 15:41
2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
    
por 13.02.2010 / 07:37