Quero encontrar alguns arquivos e movê-los.
Eu posso encontrar o arquivo com:
$ find /tmp/ -ctime -1 -name x*
Eu tentei movê-los para o meu ~/play
diretório com:
$ find /tmp/ -ctime -1 -name x* | xargs mv ~/play/
mas isso não funcionou. Obviamente, mv precisa de dois argumentos.
Não tem certeza se (ou como) fazer referência ao 'item atual' do xargs no comando mv?
-I
:find . | xargs -I'{}' mv '{}' ~/play/
, mas como homem diz, que “implica-x
e-L 1
.” Então, nenhum ganho. Melhor mantê-lo simples e usofind . -exec mv '{}' ~/play/ \;
Respostas:
Olhe para a resposta de Stephane para o melhor método, dê uma olhada na minha resposta por razões para não usar as soluções mais óbvias (e razões pelas quais elas não são as mais eficientes).
Você pode usar a
-I
opção dexargs
:Que funciona em um mecanismo semelhante ao
find
e{}
. Eu também citaria seu-name
argumento (porque um arquivo que começa comx
o diretório atual seria envolto em um arquivo e passado como argumento a ser encontrado - o que não dará o comportamento esperado!).No entanto, conforme indicado pelo manatwork, conforme detalhado na
xargs
página do manual:O importante a ser observado é que isso
-L 1
significa que apenas uma linha de saídafind
será processada por vez. Isso significa que é sintaticamente o mesmo que:(que executa uma única
mv
operação para cada arquivo).Mesmo usando o
-0
argumento GNU xargs e ofind -print0
argumento causa exatamente o mesmo comportamento de-I
- isto é paraclone()
um processo para cada arquivomv
:fonte
Com as ferramentas GNU:
A opção
-t
(--target
) é específica do GNU.-print0
,-r
,-0
, Enquanto não-padrão e originários de GNU também são encontrados em algumas outras implementações como em alguns BSDs.POSIXly:
Ambos executam o
mv
menor número de comandos necessários e funcionam com qualquer caractere que os nomes dos arquivos possam conter. O GNU pode ter a vantagem defind
continuar procurando arquivos enquantomv
começa a mover o primeiro lote.Cuidado para que todos os arquivos e diretórios acabem em um diretório, cuidado com os confrontos se vários arquivos em diretórios diferentes tiverem o mesmo nome.
fonte
mv
uma vez para todos os argumentos (ou para todos-L
ou-n
, se fornecidos). Caso contrário, a chamadamv
para cada arquivo ficará antiga (e lenta) rapidamente.Talvez este comando seja possível agora e não estava em 2013, mas funciona perfeitamente para mim:
A
-t
chave coloca a pasta de destino em primeiro lugar, liberando omv
comando para que todos os últimos argumentos sejam apenas os arquivos a serem movidos.fonte
Você pode tentar com o comando abaixo e testado e funcionou bem
fonte