Você poderia fazer algo como
k=1; find source/ -type f | while read file; do
[[ k++ -le 20 ]] && cp "$file" target/
done
Isso localizará todos os arquivos no diretório atual e copiará os 20 primeiros que encontrar para target/
. O truque é a variável $k
, que é inicializada em 1
. Então, o [[ k++ -le 20 ]] && cp
significa "Se $ k mais um for menor ou igual a 20, execute o comando cp".
O texto acima será quebrado se os nomes dos arquivos contiverem espaços, novas linhas ou outras estranhezas. Se isso pode ser um problema, use esta versão mais segura:
k=1; find source/ -type f -print0 |
while IFS= read -d '' -r file; do
[[ k++ -le 20 ]] && cp "$file" target/
done
Se você não precisa descer em subdiretórios, apenas faça
k=1; for file in *; do [[ k++ -le 20 ]] && cp "$file" target/ ; done
Finalmente, para calcular n
on the fly, você pode fazer (observe que isso também contará subdiretórios)
files=( * ); ## save all files in the current directory in an array
n=$(echo "${#files[@]} / 3 " | bc) ## get the value of n/3
for file in "${files[@]:1:$n}"; do cp "$file" bar/; done
A solução acima deve funcionar com nomes de arquivos arbitrários, incluindo os que incluem novas linhas.