Use xargs para mover arquivos de dentro de um diretório

2

Estou procurando algumas pastas no meu diretório atual. O que eu quero fazer é mover todos os arquivos dentro desses diretórios para outro diretório. Eu estou usando o seguinte comando:

find -maxdepth 1 -regex 'myRegexExpHere' | xargs -I file mv file/* Desktop/New\ folder/

Mas, como esperado, o '*' não é expandido por xargs, em vez disso, procura por um arquivo chamado * em cada pasta. O que devo fazer para alcançar meu objetivo? Por favor, sugira maneiras que envolvem o uso de xargs apenas (e não a opção -exec de find), principalmente porque eu li que usar xargs é muito mais eficiente.

    
por Parag Goel 12.11.2013 / 21:13

2 respostas

2

Você precisa que a expansão do caractere curinga ocorra em um shell executado depois que file tenha sido substituído pelo nome do arquivo correspondente. Então você precisa iniciar um shell a partir de xargs .

Melhor do que usar xargs , use o predicado exec para find . É mais simples e não tem problemas de citação.

find -maxdepth 1 -regex 'myRegexExpHere' -exec sh -c 'mv "$0"/* Desktop/New\ folder/' {} \;

Você provavelmente está complicando demais as coisas. Esse uso simples de find pode ser expresso diretamente na maioria das camadas. O Ksh tem uma sintaxe para expressões regulares:

  • @(EXPR1|EXPR2) corresponde a EXPR1 ou EXPR2
  • *(EXPR) corresponde a 0 ou mais ocorrências de EXPR
  • +(EXPR) corresponde a uma ou mais ocorrências de EXPR
  • ?(EXPR) corresponde a 0 ou 1 ocorrência de EXPR

Essa sintaxe também está disponível no bash se você executar shopt -s extglob primeiro e, em zsh, se você executar setopt ksh_glob primeiro. Então você pode usar

mv REGEX/* Desktop/New\ folder/
    
por 13.11.2013 / 01:24
1

Por que usar find quando você não precisa de recursão? Use o shell (estou assumindo o Bash aqui, modifique para atender às suas necessidades) para correspondência de regex:

for dir in */;do
    if [[ "$dir" =~ yourRegexHere ]];then
        mv -- "$dir"/* "Desktop/New folder/"
    fi
done

Se os recursos de regex do seu shell são muito fracos para suas necessidades, ele não fica melhor do que o Perl:

perl -e 'for(grep {/yourRegexHere/} glob "*/"){ 
             qx(mv -- "$_"/* "Desktop/New folder") 
         }'
    
por 12.11.2013 / 21:19