Como remover todos os arquivos em um diretório, exceto os ocultos?

5

Estou limpando um diretório de saída antes de colocar as coisas nele. Quero rastrear o diretório de saída no git com um arquivo .gitkeep , mas isso continua sendo excluído com minha linha rm -rf "$OUT_DIR" em um script bash.

Existe uma maneira de remover o conteúdo de um diretório, mas manter arquivos ocultos ou de alguma forma manter apenas o arquivo .gitkeep ?

    
por tarabyte 11.06.2015 / 19:48

4 respostas

5

Por padrão, bash não contém os arquivos de pontos, portanto, para remover tudo, menos os arquivos ocultos, em bash , usando rm :

rm *

Exemplo de saída:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1
-rw-rw-r--  1 user user    0 giu 11 20:00 2
-rw-rw-r--  1 user user    0 giu 11 20:00 3
-rw-rw-r--  1 user user    0 giu 11 20:00 4
-rw-rw-r--  1 user user    0 giu 11 20:00 5
~/test$ rm *
~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:00 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:00 .1

Para remover tudo, menos .gitkeep em bash , permitindo globbing para arquivos de pontos e usando rm :

shopt -s dotglob
rm !(.gitkeep)

Exemplo de saída:

~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:19 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 1
-rw-rw-r--  1 user user    0 giu 11 20:19 2
-rw-rw-r--  1 user user    0 giu 11 20:19 3
-rw-rw-r--  1 user user    0 giu 11 20:19 4
-rw-rw-r--  1 user user    0 giu 11 20:19 5
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep
-rw-rw-r--  1 user user    0 giu 11 20:19 .hidden
~/tmp$ shopt -s dotglob
~/tmp$ rm !(.gitkeep)
rm: cannot remove ‘.’: Is a directory
rm: cannot remove ‘..’: Is a directory
user@user-X550CL:~/tmp$ ls -la
total 8
drwxrwxr-x  2 user user 4096 giu 11 20:20 .
drwxr-xr-x 21 user user 4096 giu 11 08:26 ..
-rw-rw-r--  1 user user    0 giu 11 20:19 .gitkeep
    
por 11.06.2015 / 20:24
3

Tente isto:

shopt -u dotglob        # disable globbing for dot files
ls *

Se tudo estiver correto, substitua ls por rm .

    
por 11.06.2015 / 19:53
0

O problema é que uma remoção recursiva rm -r * se comporta de maneira diferente de uma rm * não recursiva em relação a arquivos ocultos. O primeiro remove-os, mas o segundo não (com opções de shell padrão). Mas, é claro, recursiva é necessária para remover subdiretórios.

Minha solução é usar move, o que deixa os arquivos ocultos no lugar, em vez de remover. É mais algumas linhas, mas faz sentido quando você faz isso (sem opções estranhas para lembrar).

mkdir ../deleteme
mv * ../deleteme
rm -rf ../deleteme
    
por 30.06.2017 / 13:50
0

rm * funciona bem se o diretório não contiver subdiretórios (veja a resposta de @kos ) . No entanto, se você precisar de uma solução recursiva que também remova todos os subdiretórios, então (como @meesern apontou ) rm -r * não é o que você quer, já que faz remover arquivos e subdiretórios ocultos.

Em vez disso, você pode usar find para listar e excluir arquivos e subdiretórios não ocultos (adaptados de esta resposta ):

find YOUR_DIRECTORY -not -path '*/\.*' -delete

Isso excluirá todos os arquivos não ocultos em YOUR_DIRECTORY e todos os subdiretórios que estiverem vazios depois que os arquivos não ocultos forem removidos.

Ele não removerá o conteúdo de um diretório oculto (por exemplo, YOUR_DIRECTORY/.foo/bar/baz ). Como resultado, você pode receber alguns avisos como

find: cannot delete 'some/directory/here': Directory not empty

Mas você pode ignorá-los com segurança.

    
por 19.03.2018 / 08:45

Tags