Procurar e remover arquivos com segurança

0

Eu gostaria de procurar por todos os nohup.out em meus sistemas de arquivos montados e excluí-los.

  1. Existem alguns diretórios e arquivos cujos nomes de arquivos contêm espaço, então penso em xargs -0 .

  2. Por segurança, gostaria de excluí-los de forma interativa, ou seja, ser perguntado se realmente desejo excluí-los. Então eu penso em rm -i e xargs -p

  3. Eu também gostaria de excluir cada arquivo encontrado separadamente, então penso em xargs -n 1 .

Mas o comando a seguir não funciona da maneira que espero.

locate  -i nohup.out | xargs -0 -n 1 -p rm -i

Ele não solicita a remoção de cada arquivo e solicita minha permissão.

Eu me pergunto por que e qual comando funciona como eu espero?

A propósito, minha versão xargs é xargs (GNU findutils) 4.4.2. Pode ser o motivo?

    
por Tim 28.02.2016 / 00:52

4 respostas

2

But the following command doesn't work in the way I hope.

locate -i nohup.out | xargs -0 -n 1 -p rm -i

Claro que se você estiver usando xargs -0 , então você deve combinar isso com locate -0 .

It doesn't prompt each file to be removed and ask for my permission. I wonder why

xargs deve ler a entrada de /dev/tty ao avisar você. Ele funciona dessa forma para que não haja conflito entre o uso do stdin de xargs para ler argumentos de locate e a leitura de respostas para a opção -p .

No entanto, você está usando xargs para executar rm -i . O comando rm -i também quer ler sua entrada, que será lida de stdin. Por isso, consome parte da entrada de xargs e as coisas não funcionam como você espera.

and what command works as I hope?

Se você estiver usando o Bash, essa é uma opção:

xargs -a <(locate -0 -i nohup.out) -0 -n 1 -p rm -i

No entanto, você também pode fazer tudo ao encontrar:

find / -depth -name nohup.out -ok rm -i '{}' ';'

Alterar ';' para '+' para excluir mais de um arquivo por vez. Esse requisito e as várias maneiras de resolver esse problema são explicados em o manual Texinfo para findutils .

    
por 29.02.2016 / 16:41
4

Use find não locate

find . -name "nohup.out" | xargs -n 1 -p rm

Quando você adiciona rm -i , ele atua como a entrada para o prompt -p

Você também pode usar find dessa maneira

find . -name "nohup.out" -exec rm -i {} \;
    
por 28.02.2016 / 01:08
2

Se você quiser um comportamento interativo e solicitar solicitações com xargs, convém fazer isso:

locate  -i nohup.out | xargs -d '\n' -L1 -p rm
    
por 28.02.2016 / 01:13
1

POSIXly:

find /path/to/mounted_fs -xdev -type f -name nohup.out -exec rm -i {} +

-xdev limited find para pesquisar apenas em seus sistemas de arquivos montados. Usando -exec rm -i {} + como você usa xargs , mas sem problemas com caracteres especiais no nome do arquivo.

O problema com o seu comando:

locate -i nohup.out | xargs -0 -n 1 -p rm -i

você disse a xargs para usar locate como separador de entrada, mas \n output não usou xargs mas locate , então %code% veria %code% output como uma string grande.

    
por 28.02.2016 / 11:19

Tags