Em vez de executar mv /home/ketan/hex/foo /home/maxi
, você precisará variar o diretório de destino com base no caminho produzido por find
. Isso é mais fácil se você mudar primeiro para o diretório de origem e executar find .
. Agora você pode simplesmente preceder o diretório de destino para cada item produzido por find
. Você precisará executar um shell no comando find … -exec
para executar a concatenação e criar o diretório de destino, se necessário.
destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
mkdir -p "$0/${1%/*}"
mv "$1" "$0/$1"
' "$destination" {} \;
Observe que, para evitar problemas de cotação, se $destination
contiver caracteres especiais, não será possível substituí-lo no script de shell. Você pode exportá-lo para o ambiente para que ele atinja o shell interno, ou você pode passá-lo como um argumento (foi o que eu fiz). Você pode economizar um pouco de tempo de execução agrupando sh
chamadas:
destination=$(cd -- "$destination" && pwd) # make it an absolute path
cd -- "$source" &&
find . -type f -mtime "-$days" -exec sh -c '
for x do
mkdir -p "$0/${x%/*}"
mv "$x" "$0/$x"
done
' "$destination" {} +
Como alternativa, em zsh, você pode usar a zmv
function e os qualificadores de glob .
e m
só correspondem aos arquivos regulares em o intervalo de datas certo. Você precisará passar uma função mv
alternativa que primeiro crie o diretório de destino, se necessário.
autoload -U zmv
mkdir_mv () {
mkdir -p -- $3:h
mv -- $2 $3
}
zmv -Qw -p mkdir_mv $source/'**/*(.m-'$days')' '$destination/$1$2'