linux / bash equivalente de mv -t

2
ls -al | grep -v '^d' | xargs mv -t mysubdir

Eu uso o comando acima extensivamente nos sistemas da Red Hat.

Move todos os arquivos no diretório atual para mysubdir

$ mv --version
Usage: mv [-f] [-i] [-e warn|force|ignore] f1 f2
       mv [-f] [-i] [-e warn|force|ignore] f1 ... fn d1
       mv [-f] [-i] [-e warn|force|ignore] d1 d2

qual é o equivalente do comando acima no HP-UX (HP-UX 11i versão 3 de fevereiro de 2007)

    
por user3146086 20.02.2015 / 11:52

2 respostas

1

Se xargs no seu HP-UX 11i tiver o -I sinalizador, você pode fazer isso, embora eu não tenha certeza de como você conseguiu usar ls -l output com mv :

ls -al | grep -v '^d' | xargs -I {} mv {} mysubdir

Caso você não consiga fazer isso, acho que seria a minha solução preferida:

ls -a | while read ITEM; do test ! -d "$ITEM" && mv "$ITEM" mysubdir; done

Qualquer um pode ser englobado com uma função shell ou script, portanto, o comprimento do one-liner não é necessariamente relevante.

    
por 20.02.2015 / 14:10
1

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
    
por 21.02.2015 / 01:47

Tags