xargs tenta construir uma lista de argumentos a partir de seu stdin (entrada padrão). Muitas vezes, o stdin de xargs é a saída de algum comando que foi canalizado para xargs . Para criar um exemplo inútil, podemos desperdiçar muitos caracteres listando os arquivos em nosso diretório home, em vez de apenas digitar ls -A ~ desta forma:
echo ~ | xargs ls -A
O operador de pipe | obtém o stdout (saída padrão) do comando à esquerda dele e o transmite como o stdin do comando à direita dele. É importante lembrar que stdout é apenas um fluxo de texto, o que pode causar problemas quando passado para o segundo comando por xargs se contiver espaços ou caracteres especiais. Quando usamos find , cuja saída são nomes de arquivos, com xargs , para evitar erros causados por caracteres especiais, usamos convencionalmente
find -print 0 | xargs -0
Isso faz com que find anexe o caractere nulo a cada nome de arquivo e xargs para interpretar a lista como delimitada por nulo em vez de delimitada por espaço. O caractere nulo não pode aparecer em nomes de arquivos, portanto, não há chance de que um nome de arquivo seja interpretado como dois nomes de arquivos se delimitarmos com o caractere nulo.
Como você perdeu o caractere de pipe | que separa e conecta os dois comandos find e xargs , find achou que )xargs era um de seus argumentos e não começou com - ou siga um teste válido começando com - , ele decidiu que )xargs deve ser um caminho que você deseja pesquisar, mas paths must precede expression , a sintaxe de find requer que o caminho a ser pesquisado seja fornecido antes de outros argumentos .
Muitas pessoas preferem usar -exec com find em vez de canalizar para xargs (consulte Qual é a diferença entre find com -exec e xargs? ), por exemplo:
find /path -tests ... -exec some_command {} +
Isso pode ser mais adequado no seu caso, principalmente porque o comando mv espera que seu último argumento seja o destino. Você poderia usar xargs -I {} mv {} /path/to/destination , mas seria mais legível e talvez mais eficiente para especificar o destino com -t
find /home/tony/Desktop/unsorted_files/ -maxdepth 1 -not \( -type d -or -iname "*.jpg" -or -iname "*.gif" -or -iname "*.docx" \) -exec mv -t /home/tony/Desktop/dregsfolder -- {} +