Uma maneira com find
e install
:
find /var/public/voicelogging/quality_monitoring -name \*.WAV -exec sh -c '
bn=${0##*/}; x=${bn%%-*}; dt=${x##*_}; y=${bn%_*}; id=${y##*_}
install -D "$0" "/home/username/logging/${id}/${dt}/${bn}"' {} \;
isso usa a expansão de parâmetro para extrair a data: ${dt}
e o ID do usuário: ${id}
do nome do arquivo e, em seguida, usa install
para copiar cada arquivo para o diretório correspondente userID/date
(isso é porque eu sou preguiçoso) - sem install
substituir a última linha por:
dest=/home/username/logging/${id}/${dt}; mkdir -p "${dest}" && cp "$0" "${dest}"' {} \;
Se você preferir fazer o loop sobre os diretórios "date" e, em seguida, executar um loop pelos arquivos .WAV
em cada diretório:
for d in /var/public/voicelogging/quality_monitoring/*; do
dt=${d##*/}
for f in $d/*.WAV; do
bn=${f##*/}; y=${bn%_*}; id=${y##*_}
dest=/home/username/logging/${id}/${dt}
mkdir -p "${dest}" && cp "${f}" "${dest}"
done
done
Se você tiver zsh
, é mais fácil e mais curto com zmv
(também porque zsh
é mais inteligente e você pode aninhar expansões variáveis, por exemplo ${${file%_*}##*_}
seria suficiente para extrair o ID do usuário):
dtcp () {
mkdir -p $3 && cp $1 $2 $3
}
autoload zmv
zmv -n -p dtcp '/var/public/voicelogging/quality_monitoring/(*)/(*).WAV' \
'/home/username/logging/${${2%_*}##*_}/$1'
As (*)
s criam referências que podem ser usadas no segundo parâmetro como $1
, $2
etc.
Aqui zmv
com -p
executa a função dtcp
em vez de mv
. A função cria o diretório e copia o arquivo para o diretório recém-criado. Os argumentos (a não ser confundido com as referências anteriores acima) são:
$1
: --
o que significa o fim das opções em $2
: /var/public/voicelogging/quality_monitoring/(*)/(*).WAV'
esse é o arquivo que deve ser copiado e $3
: /home/username/logging/${${2%_*}##*_}/$1
qual é o destino
Note que -n
significa dry-run ; remova-o para executar o comando.