Não -exec mv do diretório que está sendo examinado por find . Parece que find fica confuso quando você faz isso.
Solução alternativa: primeiro encontre os diretórios e mova-os.
cd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
-printf "%hcd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
-printf "%hcd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
-printf "%hcd "/mnt/user/New Movies/"
find -type f \( -name "*.avi" -or -name ".*mkv" \) -mtime +180 \
-printf "%h%pre%" > dirstomove
xargs -0 mv -t /mnt/user/Movies < dirstomove
" | xargs -0 mv -t /mnt/user/Movies
" > dirstomove
xargs -0 mv -t /mnt/user/Movies < dirstomove
" | xargs -0 mv -t /mnt/user/Movies
Explicação:
-
-printfimprime a correspondência de acordo com a string de formatação. -
%himprime a parte do caminho da correspondência. Isso corresponde ao"${0%/*}"em seu comando. -
separa os itens usando o caractere nulo. Esta é apenas uma precaução, caso os nomes de arquivos contenham novas linhas.xargs -
-0coleta a entrada do pipe e, em seguida, executa seus argumentos com a entrada anexada. -
mv -t <target>diz ao xargs para esperar que a entrada seja nula separada em vez de nova linha separada. -
mvpermite quemvseja chamado com todos os argumentos de origem anexados no final.
Observe que isso ainda não é absolutamente seguro. Algum tempo cronometrado do planejador em combinação com buffers de pipe ainda pode fazer com que o find seja executado antes que find seja movido para fora do diretório. Para evitar que você faça isso:
Explicação do histórico:
Eu acho que o que acontece com o seu find é o seguinte:
-
/mnt/user/New Movies/atravessa o diretóriofind. Enquanto lá, toma nota dos diretórios disponíveis em seu cache. -
chdir(subdirname)atravessa um dos subdiretórios usando a chamada do sistemafind. - Por dentro de
findencontra um arquivo de filme que passa pelos filtros. -
mvexecutamvcom os parâmetros fornecidos. -
/mnt/user/Moviesmove o diretório parafind. -
chdir(..)volta ao diretório pai usando a chamada do sistema/mnt/user/Movies, que agora aponta para/mnt/user/New Movies/em vez defind -
findestá confuso porque não encontra os diretórios que anotou anteriormente e gera muitos erros.
Essa suposição é baseada na resposta a essa pergunta: find - exec mv pára após o primeiro exec . Eu não sei porque find apenas pára de funcionar nesse caso e gera erros no seu caso. Versões diferentes de %code% podem ser a explicação.