Por definição, este comando obtém a entrada de um arquivo.
$ command -r FILENAME
Suponha que FILENAME
seja um arquivo que contém uma lista de nomes de arquivos, conforme foi gerado usando ls > FILENAME
.
Como posso alimentar o comando ls
diretamente com o resultado ? Na minha cabeça, algo como isto deveria ser possível:
$ ls | command -r
Mas isso não acontece, a saída de ls
não fica viciada como argumento. Resultado:
Usage: command -r FILENAME
error: -r option requires an argument
Como eu poderia obter o efeito desejado?
Respostas:
Isso depende do comando. Alguns comandos que lêem de um arquivo esperam que o arquivo seja um arquivo regular, cujo tamanho seja conhecido antecipadamente e que possa ser lido em qualquer posição e rebobinado. Isso é improvável se o conteúdo do arquivo for uma lista de nomes de arquivos: o comando provavelmente será o conteúdo de um canal que será lido apenas sequencialmente do início ao fim. Existem várias maneiras de alimentar dados através de um canal para um comando que espera um nome de arquivo.
Muitos comandos tratam
-
como um nome especial, que significa ler da entrada padrão em vez de abrir um arquivo. Esta é uma convenção, não uma obrigação.Muitas variantes do unix fornecem arquivos especiais
/dev
que designam os descritores padrão. Se/dev/stdin
existir, abri-lo e lê-lo é equivalente a ler da entrada padrão; da mesma forma,/dev/fd/0
se existir.Se o seu shell for ksh, bash ou zsh, você poderá fazer com que o shell lide com o negócio de alocar algum descritor de arquivo. A principal vantagem desse método é que ele não está vinculado à entrada padrão; portanto, você pode usar a entrada padrão para outra coisa e usá-la mais de uma vez.
Se o comando espera que o nome tenha uma forma específica (geralmente uma extensão específica), você pode tentar enganá-lo com um link simbólico.
Ou você pode usar um pipe nomeado.
Observe que gerar uma lista de arquivos com
ls
é problemático porquels
tende a alterar os nomes dos arquivos quando eles contêm caracteres não imprimíveis.printf '%s\n' *
é mais confiável - ele imprime todos os bytes literalmente nos nomes dos arquivos. Os nomes de arquivos que contêm novas linhas ainda causarão problemas, mas isso é inevitável se o comando esperar uma lista de nomes de arquivos separados por novas linhas.fonte
Deveria ser:
Editar: para nomes com espaços em branco:
fonte
command
acreditar que possui todos os nomes de arquivos necessários na linha de comando de uma só vez. Algumas versões do xargs fornecerãocommand
alguns nomes de arquivos (10, ao que me parece) por vez. Parece que o GNU xargs oferece tudo de uma vez.Na verdade, a única solução confiável que eu conheço que pode lidar com todos os nomes de arquivos, incluindo aqueles com uma nova linha, é:
O único caractere não permitido no nome do arquivo nesse caso é o caractere nulo, que não é permitido nos nomes dos arquivos.
fonte
Muitos comandos aceitam
-
como "nome do arquivo" que significa "use a entrada padrão", mas essa convenção está longe de ser universal. Leia a página do manual.fonte
Isso deve funcionar para o seu propósito:
ls | command -r /dev/stdin
fonte