A recursiva rm não funciona para mim

0

Suponha que tenhamos os seguintes arquivos em um diretório:

test.txt
test.txt~
/subdir
  test1.txt
  test1.txt~

Quando executo rm -r ./*.*~ dentro do diretório superior, somente o test.txt ~ é removido.

Por que ele não realiza a remoção recursiva apesar do fato de eu ter usado sinalizador recursivo?

Você pode reproduzir meu caso com o seguinte script:

#create dir and 1-st level test files
mkdir dir
cd dir
touch test.txt
touch test.txt~

#create subdir and 2-nd level test files
mkdir subdir
cd subdir/
touch test1.txt~
touch test1.txt

cd ..
rm -r ./*.*~
    
por user4035 07.08.2015 / 19:12

2 respostas

5

*.*~ não se expande para nenhum diretório, apenas corresponderá a qualquer arquivo ou diretório no diretório atual que tenha um . em algum lugar e termine em ~

Se você quiser encontrar todos os arquivos que terminam em ~ do diretório em que você está, eu usaria find like

find -type f -name '*~' -delete
    
por 07.08.2015 / 19:23
6

Seu rm -r *.*~ (o mesmo que rm -r ./*.*~ ) removeria arquivos e diretórios correspondentes a *.*~ que são arquivos e diretórios cujo nome contém um ponto e termina com ~

Mas subdir não contém nenhum ponto, por isso não cabe.

Leia glob (7) e lembre-se de que é a sua concha (não a /bin/rm program!) que faz o globbing .

Então, o que está acontecendo é que você digita rm -r ./*.*~ no seu shell. Seu shell está expandindo isso para rm -r ./test.txt~ ; então ele encontra o programa /bin/rm no seu $PATH , chama fork (2) para criar um processo filho e, em seguida, execve (2) no programa /bin/rm , com uma matriz de argumentos de rm -rf ./test.txt~ so rm nem sequer vê ./subdir

Para que todo arquivo de backup seja removido em qualquer subdiretório direto, digite rm */*.*~ ; com recente bash (versão 4 ou posterior) e zsh você pode remover qualquer arquivo de backup até mesmo no fundo da árvore de arquivos com rm **/*.*

Uma maneira possível de entender o que o shell está fazendo é substituir seu comando (por exemplo, rm ) por echo . Isso deve dar-lhe a expansão (mas leia echo (1) , pois echo está entendendo algumas opções como -n ). Em alguns shells bons, você pode até usar a tecla tab para autocompletar . Estou usando o zsh como meu shell interativo porque gosto de seus recursos de autocompletar.

Por fim, rm (1) sabe sobre -i interativamente antes da remoção). Então eu vou sugerir rm -i **/*~

BTW, se você não sabe sobre sistemas de controle de versão, é hora de aprendê-los (eu recomendo strongmente usar git . ...), especialmente para código "fonte" como arquivos (programas em C ou Python, scripts de shell, etc etc etc ...) e você não precisará de arquivos de backup.

    
por 07.08.2015 / 19:15

Tags