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:
-
-printf
imprime a correspondência de acordo com a string de formatação. -
%h
imprime 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
-
-0
coleta 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. -
mv
permite quemv
seja 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
find
encontra um arquivo de filme que passa pelos filtros. -
mv
executamv
com os parâmetros fornecidos. -
/mnt/user/Movies
move 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
-
find
está 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.