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?