Eu tenho várias pastas, cada uma com arquivos de áudio. Eu quero pegar 30% de cada um desses arquivos e cortá-los (não copiar) para outra pasta. Posso ver este post que pode me ajudar a fazer isso, pois sei o número de arquivos em cada pasta. Infelizmente, o número pode mudar e eu quero uma única linha de bash canalizada que possa fazer isso. Isso é possível? Como faço para escolher 30% dos arquivos e cortá-los para outra pasta?
Com
bash
4.4+ e em um sistema GNU, você pode fazer:para preencher a
$files
matriz com uma lista embaralhada de todos os arquivos no diretório atual.Então você pode mover 30% deles com algo como:
(remova o
echo
quando estiver satisfeito ele vai fazer o que você quer).O equivalente no
zsh
shell poderia ser algo como:Essa é a mesma abordagem, apenas terser e não precisar de utilitários externos. Tradução:
shopt -s nullglob
->N
qualificador glob (cria um array vazio quando não há arquivo).shopt -s dotglob
->D
qualificador glob (não exclua arquivos cujo nome comece com um ponto).sort -Rz
:noe['REPLY=$RANDOM']
(embaralhe a lista classificando usando uma ordem aleatória).${array[@]:offset:length}
->$array[first,last]
(zsh agora também suporta a sintaxe do shell Korn, mas acho o zsh mais legível).bash
nós usamos registros delimitados por NUL (-d ''
/-z
/\0
) para poder lidar com nomes de arquivos arbitrários. Não é necessário,zsh
pois a lista nunca é transformada em uma única string/stream.Tudo o que você precisa fazer é encontrar o número de arquivos e a porcentagem separadamente. Por esta
$(ls | wc -l)
irá calcular primeiro o número de ficheiros na pasta$(( x * 30 /100))
fará a operação aritmética de encontrar os 30% desse númeroshuf -n
para obter uma lista aleatória de arquivos