find: os caminhos devem preceder a expressão:) xargs [duplicate]

0
mkdir dregsfolder
find /home/tony/Desktop/unsorted_files/ -maxdepth 1 -not \( -type d -or -iname "*.jpg" -or -iname "*.gif" -or -iname "*.docx" \)xargs -0 --no-run-if-empty mv /home/tony/Desktop/dregsfolder

Quando executo esse código; Eu sou aconselhado

find: paths must precede expression: )xargs

Estou confuso porque achei que o caminho já havia sido especificado com o /home/tony/Desktop/unsorted_files .

Estou ainda mais confuso, porque em esta questão no Unix & amp; Linux Stack Exchange, temos um exemplo de xargs copiando arquivos para um diretório chamado play :

find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/

E aqui, parece que o diretório de destino, ou seja, jogar; foi especificado APÓS o xargs ...

Estou querendo esclarecer os mecanismos precisos associados a xargs e as nuanças associadas, para a análise de não apenas um arquivo de um diretório (como identificado na pergunta anterior), mas, além disso, seu uso mais amplo dentro do mundo unix em relação aos parâmetros.

    
por IronUhlan 10.11.2017 / 17:24

2 respostas

5

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 -- {} +
    
por Zanna 10.11.2017 / 18:04
3

" find: paths must precede expression: )xargs " é a maneira de find dizer que, enquanto processava seus parâmetros, viu algo que parece um ponto de partida (na verdade, NÃO se parecia com uma expressão) DEPOIS de pensar foi feito a análise de caminhos para pesquisa e o problema foi encontrado em " )xargs ". man find diz find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

Você omitiu o símbolo de pipe ( | ) para conectar a saída de find à entrada de xargs .

Outro ponto - Usando a opção " -0 " para xargs requer que você diga para separar os nomes dos arquivos com NUL s, com -print0 - você não usa.

Você leu minha resposta para Movendo arquivos de tipo / extensão específicos de um diretório para outro? ?

    
por waltinator 10.11.2017 / 17:43