Como remover apenas o conteúdo dos diretórios?

14

Estou em uma pasta: /var/myfolder.

Dentro, existem outras pastas como: /var/myfolder/A/ /var/myfolder/B/ `/var/myfolder/C/etc.

Dentro de cada um, existem alguns arquivos com nomes aleatórios. Como faço para remover todos os arquivos de todas as pastas dentro /var/myfolder?

A estrutura (todos os diretórios, por exemplo, A, B, C etc., dentro /var/myfolder) deve permanecer intacta.

IroeN
fonte

Respostas:

17

Experimentar:

find /var/myfolder -type f -delete

Isso obtém todos os arquivos regulares em / var / myfolder e os exclui deixando apenas os diretórios.

StarNamer
fonte
Obrigado pela solução. Devo mencionar que estou fazendo isso no Solaris 9, portanto, minha descoberta não tem a opção -delete, mas esse é um bom ponto de partida.
precisa saber é o seguinte
2
Consegui encontrar a seguinte solução: find / var / myfolder -type f -exec rm -f {} \;
IroeN
2
Desculpe. Eu uso o Debian ou Ubuntu. Sua solução é equivalente, tanto quanto eu sei.
StarNamer
6
-type f! =! -type d
mikeserv
7

Com o zsh, use o . qualificador glob para corresponder apenas aos arquivos regulares:

rm -- **/*(.)

Isso exclui todos os arquivos regulares (não ocultos) no diretório atual e seus subdiretórios recursivamente. Adicione o Dqualificador glob para excluir arquivos regulares ocultos (e arquivos regulares em diretórios ocultos) também.

Gilles 'SO- parar de ser mau'
fonte
Estou usando o bash.
precisa saber é o seguinte
1
@ user6554: ... que nem a sua pergunta, nem as tags utilizadas indicam;)
0xC0000022L
3

Você pode executar rm */*em/var/myfolder

Dinesh
fonte
3
find . -depth -exec rm {} + 2>/dev/null

rm não remove diretórios - então execute-o em tudo.

Para preservar links simbólicos para diretórios:

find .  ! -type d -exec sh -c '
    for f do [ -d  "$f" ] || 
          set "$@" "$f";  shift
    done; rm  "$@"' sh  {} +

E acho que isso também deve funcionar, talvez, de uma maneira um pouco otimizada, se houver muitos arquivos que talvez precisem de teste na versão acima:

find . ! \( -type l -o -type d \)  \
-exec  rm {} + -o -exec  sh -c '
       for f do [ -d "$f" ] ||
       unlink "$f";done' sh {} +
mikeserv
fonte
Note que o GNU findtem uma -xtypeopção para isso.
Stéphane Chazelas
@ StéphaneChazelas - ast também. mas eu não precisava de profundidade, acho que não. eu o mantive no primeiro para evitar tantas chamadas de erro - silenciadas ou não - mas era apenas bobo nas outras.
mikeserv
1
# This will delete all directory contents, including hidden files and
# subdirectories, without deleting the directory itself

# With GNU find:
find /path/to/directoryToEmpty -mindepth 1 -delete

# OpenBSD (and probably other BSDs)
find /path/to/directoryToEmpty -mindepth 1 -depth -exec rm -f {} \;

# To see what it deletes, in the order it will delete it:
find /path/to/directoryToEmpty -mindepth 1 -depth -print
vison
fonte
0
rm var/myfolder/*/*

Isso excluirá tudo dentro das subpastas sem tocar nas próprias subpastas.

A primeira *é para os subdiretórios de myfoldersi ( A, B...). A segunda *é para os arquivos A, Betc.

Se houver mais pastas dentro A, Betc. Primeiro prazo: rm /var/myfolder/*/*/*em seguida, executar rm /var/myfolder/*/*.

Edgar Naser
fonte
0

Você também deve poder fazer o cd na parte superior da árvore de diretórios em questão e executar:

find . -type f -print0 | xargs -0 rm -rf

e isso deve excluir todos os arquivos enquanto mantém intacta a árvore de diretórios. As opções -print0 e -0 podem ser omitidas se você tiver certeza de que não possui nenhum nome de arquivo ou diretório que contenha espaços.

O comando find distingue entre arquivos (-type f) e links (-type l), portanto, isso deve deixar os links intactos, se houver. Não testado embora. Em caso de dúvida, execute:

encontrar . -tipo l

e veja se algo aparece antes de você executar o comando find anterior.

rjh427
fonte
Você pode explicar como a rmbandeira -r, -R, --recursive - remove directories and their contents recursivelyse encaixa nisso?
Stephen Rauch
Como não estamos executando o rm -rf, estamos executando o find. -type fe, em seguida, canalize a saída para rm -rf. Portanto, ele remove apenas arquivos, não toca nos diretórios. Isso é o que o | O xargs bit sim, pega a saída do comando à esquerda e a envia ao comando à direita.
Rjh427
Meu ponto, exatamente. Se você não está passando nenhum diretório, qual o uso de um sinalizador que funciona apenas em diretórios?
Stephen Rauch
Porque a memória muscular, e ainda funciona. Você pode levantar a mesma objeção na opção -f "force", eu daria a mesma resposta.
Rjh427
-2

Basta usar o comando abaixo:

sudo rm -rf directory_in_which_you_have_content / *

---------------- OU --------------------------------- -----------------------

O '*' significa tudo; assim, quando você usará *, excluirá todo o conteúdo. Portanto, use um comando como este ou vá para o diretório em que deseja excluir todo o conteúdo e use o comando abaixo:

sudo rm -rf *

keyur bhatt
fonte