Como apagar arquivos, simbólicos em uma pasta, mas deixar seus subdiretórios inalterados?

1

Suponha que haja uma pasta que tenha arquivos, links simbólicos e subdiretórios da seguinte forma:

files: file1, file2, file3, file4
symbolic links: link1-->file2, link2-->file3
subdirectories: dir1, dir2

Eu quero excluir arquivo1, arquivo3, arquivo3, arquivo4, link1 e link2. Mas deixe dir1 e dir2 inalterados.

Observe que não há um padrão como file* pode cobrir o nome de todos os arquivos. O nome dos arquivos acima são apenas por exemplo e, na verdade, o nome deles é diferente.

    
por Yulong Ao 01.11.2014 / 08:50

5 respostas

2

Você pode usar find com um argumento type .

find . -maxdepth 1 -type f -exec rm -f {} \;

Você pode executar uma execução a seco removendo a parte -exex rm -f {} \; para ver os arquivos que seriam excluídos.

    
por 01.11.2014 / 09:02
1

A maneira simples é usar

$ rm ./*

Aqui não estamos usando a exclusão recursiva ( -r ) e, portanto, somente os arquivos (exceto os ocultos) no diretório pai devem ser excluídos.

    
por 01.11.2014 / 09:05
1

Usando o bash (e ignorando links simbólicos):

for file in *; do [[ -f $file ]] && rm -- "$file"; done
    
por 01.11.2014 / 09:40
0

com zsh :

rm -- *(.)

remove apenas os arquivos regulares

rm -- *(D.)

para incluir também arquivos de pontos (ocultos)

rm -- *(D^/)

remove todos os tipos de arquivos, exceto diretórios (que incluem links simbólicos para diretórios)

rm -- *(D^-/)

remove todos os tipos de arquivos, exceto diretórios e links simbólicos para diretórios (isso removeria links simbólicos para diretórios, se não puder determinar o tipo de destino do link simbólico).

O equivalente em% GNUfind desse último seria:

find . -maxdepth 1 ! -xtype d -delete
    
por 01.11.2014 / 10:34
-1
sudo mkdir a b c d e

sudo touch a/1 b/2 c/3 d/4 e/5 e/a e/b   
ls                  
a  b  c  d  e  pqr  xyz

cd a/         
ls   
1

cd ../e/     
ls      
5 a b

cd /var/warehouse/abc/  
find . -type f ! -path "./a*" ! -path "./b*"        
./d/4   
./e/a   
./e/b   
./e/5   
./c/3

sudo find . -type f ! -path "./a*" ! -path "./b*" -exec rm -f {} \;
    
por 01.11.2014 / 09:22