Como posso especificar argumentos de linha de comando usando pipes no Linux?

7

Sou novato na programação de shell e não tenho ideia de como resolver esse problema.

Acabei de baixar um arquivo da Internet para o diretório padrão ~/Downloads . Eu quero mover esse arquivo para outro diretório, ~/Documents .

Como não sei o nome exato do arquivo baixado, acho que posso usar o seguinte comando para atingir meu objetivo:

ls -t ~/Downloads | head -1 | mv [source] [destination]

Como posso especificar qual parâmetro formal será substituído? No meu caso, quero omitir [source] e preencher o parâmetro [destination] como ~/Documents eu mesmo.

    
por Summer_More_More_Tea 25.09.2011 / 06:26

3 respostas

4

Você quer xargs .

echo "foo" | xargs touch
ls -l foo
    
por 25.09.2011 / 06:29
17
ls -t ~/Downloads | head -1 | xargs -I  {} mv ~/Downloads/{} ~/Documents

Isso funcionará com arquivos que tenham espaços em seus nomes.

    
por 25.09.2011 / 08:35
14

Você também pode usar o operador bash 'de substituição de comandos (backticks) como

mv 'ls -t ~/Downloads | head -1' ~/Documents

como uma solução única se você não quiser mover vários arquivos de uma só vez. Veja a man page do bash:

Command Substitution
   Command  substitution  allows  the output of a command to replace the command name.  There
   are two forms:

          $(command)
   or
          'command'

   Bash performs the expansion by executing command and replacing  the  command  substitution
   with  the  standard  output  of the command, with any trailing newlines deleted.  Embedded
   newlines are not deleted, but they may be removed during word splitting.  The command sub‐
   stitution $(cat file) can be replaced by the equivalent but faster $(< file).

   When  the  old-style backquote form of substitution is used, backslash retains its literal
   meaning except when followed by $, ', or \.  The first backquote not preceded by  a  back‐
   slash terminates the command substitution.  When using the $(command) form, all characters
   between the parentheses make up the command; none are treated specially.

   Command substitutions may be nested.  To nest when using the backquoted form,  escape  the
   inner backquotes with backslashes.

   If  the  substitution  appears within double quotes, word splitting and pathname expansion
   are not performed on the results.
    
por 25.09.2011 / 11:00