Apenas outra alternativa (isso requer algumas extensões específicas do GNU, já que você marcou a pergunta "Unix", pode não se encaixar):
grep -lZd skip TEST SOURCE/* | xargs -0I{} mv -i {} DEST
-
grep -limprime nomes de arquivos correspondentes em vez da saída normal.
-
grep -Zfornece uma saída nula separada por byte, o que é uma aposta segura na manipulação de nomes estranhos de arquivos através de pipes.
-
grep -d skipdefine a ação
skippara diretórios encontrados entre os argumentos de entrada.Isso não é realmente necessário; apenas evita o aviso
grep: SOURCE/DIR: Is a directoryao encontrar diretórios. Se você quiser leitura recursiva de arquivos em diretórios, use a açãorecurse, ou até menor, apenas a opção-requivalente (veja também o ponto abaixo). -
SOURCE/*corresponde a todos os arquivos no diretório
SOURCEusando shell globbing . Arquivos ocultos são por padrão não correspondidos; isso pode ser alterado definindoshopt -s dotglobno Bash antes do comandogrepser emitido.Pode-se ficar tentado a adicionar
SOURCE/.*aos argumentos de entrada, mas isso terá talvez consequências inesperadas se usado com-r(já que também combinamos.e..).Se a correspondência recursiva for desejada, use apenas
-r SOURCEsem globbing de arquivo como o argumento de entrada, o que inclui arquivos ocultos na estrutura de diretórios. -
xargs -0interpreta a entrada como nula separada.
-
xargs -I{}define
{}como um marcador para o argumento de entrada. -
mv -itorna a jogada interativa de acordo com a sugestão de Dennis, para evitar erros.
Para testar esse padrão (ou comandos em geral), uma técnica útil é inserir echo antes do comando real para ver quais comandos devem ser executados, ou seja, alterar mv para echo mv .