Use a opção find
e sua -exec
(aqui usando o GNU find
para o predicado -regex
):
find . -regextype posix-egrep -regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec mv {} "$DESTN_DIR" \;
Nota:
-
find .
diz afind
para procurar por arquivos que estão começando no diretório atual. -
Por padrão, o GNU
find
usa expressões regulares no estilo emacs. Eu prefiro-regextype posix-egrep
mas você pode mudar para qualquer um dos estilos suportados com os quais você está familiarizado. -
Uma expressão regular é usada para selecionar os arquivos:
-regex '.*/aaa_bbb_ccc_ddd_(cost|revenue|benefit|profit|loss)_[[:alpha:]]+_[0-9]+\.csv\.gz'
. Isso permite que o prefixo padrão deaaa_bbb_ccc_ddd_
seguido por uma das palavras especificadas por(cost|revenue|benefit|profit|loss)
, seguido por outra palavra não especificada,_[[:alpha:]]+
, seguido por uma data,_[0-9]+
, seguido pela extensão desejada de.csv.gz
. Você pode querer ajustar isso. -
Qualquer um desses arquivos encontrados será movido para o diretório de destino por meio de
-exec mv {} "$DESTN_DIR" \;
. Quandofind
localizar um arquivo correspondente, ele executará esse comando substituindo{}
pelo nome do arquivo. Isso funcionará mesmo que os nomes dos arquivos tenham espaços, novas linhas ou outros caracteres difíceis.
Usando o estilo padrão (emacs) de expressão regular
O estilo padrão de regex para o GNU find
requer algum escape dos operadores de agrupamento e alternação:
find . -regex '.*/aaa_bbb_ccc_ddd_\(cost\|revenue\|benefit\|profit\|loss\)_[[:alpha:]]+_[0-9]+\.csv\.gz' -exec echo mv {} targetdir \;
Mac OSX
A versão Mac OSX de find
( página man aqui ) suporta -regex
mas não -regextype
. Eu não ficaria surpreso, porém, se sua sintaxe regex exigisse algumas mudanças sutis.
IBM AIX 5
A página do manual para a versão do IBM AIX de find
é aqui . Não suporta -regex
.