Para copiar o arquivo mais antigo para ../complete
:
cp -v "$(find ../in -maxdepth 1 -type f -printf '%T@ %pfind ../in -maxdepth 1 -type f -printf '%T@ %p$ ls -lt ../in/
total 0
-rw-r--r-- 1 user user 0 Jun 24 08:18 file2
-rw-r--r-- 1 user user 0 Jun 24 08:18 file3
-rw-r--r-- 1 user user 0 Jun 24 08:18 file4
-rw-r--r-- 1 user user 0 Jun 24 08:18 file5
-rw-r--r-- 1 user user 0 Jun 24 08:17 file_oldest
$ cp -v "$(...)" ../complete
'../in/file_oldest' -> '../complete/file_oldest'
$
$ find ... | xargs ... ../error
'../in/file2' -> '../error/file2'
'../in/file3' -> '../error/file3'
'../in/file4' -> '../error/file4'
'../in/file5' -> '../error/file5'
' | sort -zn | \
sed -zn '2,$s/[0-9,\.]\+ //p' | xargs -0 cp -vt ../error
' | sort -zn | \
sed -zn '1s/[0-9,\.]\+ //p')" ../complete
Para copiar o todo, exceto o mais antigo para ../error
:
cp -v "$(find ../in -maxdepth 1 -type f -printf '%T@ %pfind ../in -maxdepth 1 -type f -printf '%T@ %p$ ls -lt ../in/
total 0
-rw-r--r-- 1 user user 0 Jun 24 08:18 file2
-rw-r--r-- 1 user user 0 Jun 24 08:18 file3
-rw-r--r-- 1 user user 0 Jun 24 08:18 file4
-rw-r--r-- 1 user user 0 Jun 24 08:18 file5
-rw-r--r-- 1 user user 0 Jun 24 08:17 file_oldest
$ cp -v "$(...)" ../complete
'../in/file_oldest' -> '../complete/file_oldest'
$
$ find ... | xargs ... ../error
'../in/file2' -> '../error/file2'
'../in/file3' -> '../error/file3'
'../in/file4' -> '../error/file4'
'../in/file5' -> '../error/file5'
' | sort -zn | \
sed -zn '2,$s/[0-9,\.]\+ //p' | xargs -0 cp -vt ../error
' | sort -zn | \
sed -zn '1s/[0-9,\.]\+ //p')" ../complete
Explicação :
-
%código%
-
find
desce apenas 1 nível; portanto, ele não pesquisará o diretório negativamente. -
-maxdepth 1
corresponde apenas a arquivos. -
-type f
um formato de saída personalizado.-printf '...'
fornece a hora da última modificação do arquivo em um registro de data e hora,%T@
é o nome do arquivo. Observe o%p
no final. Os arquivos são impressos delimitados por byte nulo, não delimitados por nova linha, porque a nova linha provavelmente poderia ser um caractere no nome do arquivo, o que quebraria o comando.
-
-
lerá a saída delimitada por byte nulo (sort -zn
-z
) e classificará numericamente (-n
). -
sed -zn
lê a saída delimitada por byte nulo.-
1
corresponderá apenas à primeira linha (primeiro comando) e2,$
corresponderá a todos os outros (segundo comando) -
s/[0-9,\.]\+ //p
removerá o timestamp principal da saída.
-
- Apenas do segundo comando:
xargs -0 cp -vt ../error
processa a saída delimitada por byte nulo (-0
) e chamacp -vt ../error
em toda entrada, que copia os arquivos.
Exemplo de saída :
%pre%