Por que o 'head' não quer me dar o nome do arquivo no topo da lista 'find'?

1

Eu preciso escolher o arquivo de som menos reproduzido recentemente de um diretório e colocá-lo em outro. Eu tentei:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 -exec cp {} /home/carl/playout_rock_SE/ \;

Eu recebo:

head: invalid option - - ’e’
    
por carlos 30.12.2016 / 21:44

2 respostas

3

Aqui está uma alternativa que evita head ing e sed ing (e também deve ser seguro para qualquer nome de arquivo legal):

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@\t%p
find /home/carl/music/rock/SE/ -name "*_" -printf '%A@\t%p%pre%' |
  sort -znk1,1 | { read -r -d '' t f; cp -v -- "$f" "/home/carl/playout_rock_SE/" ; }
' | sort -znk1,1 | { read -r -d '' t f; cp -v -- "$f" "/home/carl/playout_rock_SE/" ; }
    
por steeldriver 31.12.2016 / 02:39
2

Se você usar um pipe, o comando antes do pipe é concluído. Você não pode retomar seu comando find com -exec no outro lado dele. O comando head acha que -exec é uma série de opções para ele, mas não possui essa opção como -e , portanto, "opção inválida"

Se os seus nomes de arquivos não têm espaços ou outros caracteres estranhos, você deve ser capaz de gerenciar assim:

find /home/carl/music/rock/SE/ -name "*_" -printf '%A@ %p\n' | sort -n | head -n 1 | sed 's/.* //' | xargs -p -I '{}' cp -v -- '{}' /home/carl/playout_rock_SE/
  • sed 's/.* //' remove o timestamp agora que escolhemos o arquivo (isso retira tudo e inclui o primeiro espaço)
  • -p interactive - confirme antes de executar o comando
  • -I replace string - para que possamos colocar o nome do arquivo de entrada antes do destino para fornecer a sintaxe correta do cp
  • cp -v -- nos diz o que está sendo copiado e trata qualquer coisa depois disso como um argumento, mesmo que pareça uma opção

No entanto, eu recomendo usar a resposta muito mais confiável do steeldriver ;)

    
por Zanna 30.12.2016 / 22:08