com zsh
:
mv dir1/**/*.txt*(D.om[3,-1]) dir2/
Mudaria os arquivos regulares em dir1
, exceto os 2 modificados mais recentemente para dir2
.
-
**/
: qualquer nível de subdiretório. -
D
: inclua arquivos ocultos e desça em diretórios ocultos. -
.
: somente arquivos regulares (nenhum link simbólico, diretório ...), equivalente parafind
'-type f
. -
om
: classificar por hora da modificação (a mais recente primeiro como comls -t
). -
[3,-1]
: somente do terceiro ao último
(você pode emitir um zmodload zsh/files
para obter um mv
embutido ou usar zargs
se você encontrar um problema lista de argumentos muito grande ).
POSIXly, isso simplesmente não pode ser feito sem fazer algumas suposições sobre os nomes dos arquivos, o número de arquivos e o comprimento de seus caminhos.
GNUly (com versões recentes de ferramentas GNU para -z
), você poderia fazer:
find dir1 -name '*.txt*' -type f -printf '%T@\t%pfind dir1 -type f -printf '%T@\t%pmv dir1/**/*.txt*(D.om[3,-1]) dir2/
' | sort -rnz |
tr '\nfind dir1 -name '*.txt*' -type f -printf '%T@\t%pfind dir1 -type f -printf '%T@\t%p%pre%' | sort -rnz |
tr '\n%pre%' '%pre%\n' |
tail -n +3 | cut -f2- |
tr '\n%pre%' '%pre%\n' | xargs -r0 mv -t dir2
' |
sort -rnz | tail -zn +3 | cut -zf2- | xargs -r0 mv -t dir2
' '%pre%\n' |
tail -n +3 | cut -f2- |
tr '\n%pre%' '%pre%\n' | xargs -r0 mv -t dir2
' |
sort -rnz | tail -zn +3 | cut -zf2- | xargs -r0 mv -t dir2
Embora o% GNUsort
e xargs
tenham tido opções -z
/ -0
há décadas, a adição de -z
para cut
e tail
é bem recente. Se você tem versões mais antigas, você sempre pode fazer:
Observe que, embora essas soluções procurem arquivos recursivamente em dir1
(inclusive em subdiretórios), eles não recriarão a mesma estrutura de diretório em dir2
. Isso significa que, por exemplo, se houvesse ambos, dir1/file.txt
e dir1/subdir/file.txt
, ambos seriam movidos para dir2/file.txt
, um sobrescrevendo o outro.