Não é possível solicitar ao usuário usando a opção de prompt rm bultin -i com xargs e localize

0

Estou usando xargs e rm com find para remover arquivos que seguem um padrão específico definido por find da seguinte maneira. p>

touch file
find . -name file | xargs rm

Tudo funciona bem com o código acima, mas se eu digitar a opção -i para rm, então executando:

touch file
find . -name file | xargs rm -i

impressões:

rm: remove regular empty file ‘./file7’? user@host:$

sem me deixar digitar y ou n? Assim, o arquivo não é removido.

Qual é o problema aqui?

Eu também estou ciente do parâmetro -p do xargs que funciona, mas é mais geral. Isto é, solicita ao usuário que execute o comando específico, que não é amigável ao usuário.

EDIT: Ao usá-lo em um script shell, descobri que ele executa o comando que eu quero, mas também imprime o resultado do find. Algo que não é preferível.

Além disso, quando eu passar o comando ls file2 para a variável cmd, ele não imprime especificamente as especificações do arquivo2. A mesma coisa acontece quando eu digito rm -i file2 . Ele me pede para apagar todos os arquivos no diretório.

Este é o meu script:

#!/bin/bash
touch file{1..9}      # Create 9 files named file1,file2...file9
echo -n 'command: '  # Prompt user
read -e cmd             # read command
find . -exec ${cmd} '{}' +  

A única solução em que consigo pensar é solicitar ao usuário separadamente seu padrão preferido. Em seguida, armazene esse padrão em uma variável e passe-o como um argumento para a opção -name do find do comando .

Algo parecido com isto:

#!/bin/bash
touch file{1..9}     # Create 9 files named file1,file2...file9
echo -n 'command: '  # Prompt user for command
read -e cmd          # read command
echo -n 'pattern: '  # Prompt user for pattern
read -e pattern
find . -name "$pattern" -exec ${cmd} '{}' +  

Mas, mesmo com essa solução, a saída do find ainda é impressa e se o campo padrão for deixado vazio (ou seja, o usuário simplesmente não quiser usar um padrão), ocorrerão problemas.

Alguma idéia?

    
por Elefther 07.12.2014 / 12:20

3 respostas

0

O problema aqui é que stdin (a entrada padrão) para o comando foi executado a partir de xargs (neste caso rm ) é redirecionado de /dev/null e stdin é o descritor de arquivo usado por rm para obter a confirmação do usuário.

Você pode usar a opção -a para que rm obtenha a lista de arquivos de um arquivo intermediário gerado anteriormente pelo comando find (a opção -a torna xargs deixar o stdin intacto), em qualquer caso, eu entendo isso pode não ser o que você realmente quer, uma vez que requer o arquivo intermediário. Uma abordagem mais direta, semelhante ao que você queria, pode ser obtida com o comando abaixo:

for i in $(find . -name file); do rm -i "$i"; done

    
por 07.12.2014 / 13:05
2

xargs lê dados de stdin. Quando você usa rm -i rm também tenta ler a resposta de stdin (tente touch test && echo y | r -i test ; ls test ), mas stdin é fechado por xargs (suponho), então rm reage como se você tivesse pressionado ctrl-d no prompt.

Outra solução pode ser a opção -exec do find:

touch test
find . -name test -exec rm -i {} \;
    
por 07.12.2014 / 12:53
0
     Just try that command

    find . -type f -iname filename -delete


  it is better to delete the need file.

   -type f ----> specific the file type ( file or directory or etc. )
   -iname  ----> ignore the case sensitive ( test or Test)
   -delete ----> its one of find command option, its delete files  
    
por 08.12.2014 / 11:36