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 -- {} +