mv -t
é uma conveniência fornecida pelo comando GNU mv
(aquele que você tem no Linux). Outras variantes unix não têm isso, você precisa colocar o destino no final. Isso torna menos conveniente o uso com xargs
ou find … -exec
(é por isso que mv -t
foi inventado).
Uma maneira de colocar os argumentos na ordem correta é invocar um shell.
… | xargs sh -c 'mv "$@" "$0"' mysubdir
( mysubdir
é o argumento 0 para o shell; os argumentos passados em lotes por xargs
compõem os parâmetros posicionais "$@"
.)
Tenha em atenção que xargs
não é robusto: espera entradas numa sintaxe de cotações peculiares. Seu fragmento será interrompido se você tiver nomes de arquivos contendo espaço em branco ou um dos caracteres \"'
. Veja Por que meu script de shell sufocar em espaços em branco ou outros caracteres especiais? para mais informações. Para evitar problemas com caracteres especiais em nomes de arquivos, use find … -exec …
:
find . -name . -o -type d -prune -o sh -c 'mv "$@" "$0"' mysubdir {} +
( -name . -o -type d -prune -o
ignora os subdiretórios sem recorrer a eles.)
Para o seu caso de uso de mover não-diretórios, se mysubdir
em si ainda não contiver subdiretórios, seria mais simples mover todos os arquivos e, em seguida, mover diretórios de volta:
mv * mysubdir/; mv mysubdir/*/ .
Como alternativa, como você não deseja recorrer a subdiretórios, você pode usar um loop de shell para enumerar arquivos e pular aqueles que são diretórios.
for x in ./*; do
[ -d "$x" ] || mv "$x" mysubdir/
done