Eu acho que a maneira direta é usar ls
para listar os arquivos, o que ele faz em ordem alfabética (e omitindo arquivos ocultos) por padrão, pegar o primeiro de cada diretório com head
, e então ter um Um pouco de código shell para descobrir o nome do arquivo para o qual eles devem ser copiados. Como neste script bash:
for d in ./*/; do
src="$(ls "$d" | head -n 1)"
dstbase="newdir/$(basename "$src")"
if [[ ! -f "$dstbase" ]]; then
cp "$src" "$dstbase"
else
suffix=1
while [[ -f "$dstbase.$suffix" ]]; do
let suffix++
done
cp "$src" "$dstbase.$suffix"
fi
done
Obviamente, você terá que ajustar os caminhos de arquivo conforme necessário para sua situação atual. Isso também é bastante frágil no sentido de que pode haver problemas se houver diretórios em dir1
, dir2
, etc. que você deseja excluir da cópia. Ele também tem uma condição de corrida potencial no loop que procura um nome de arquivo não utilizado; isso provavelmente não será um problema, mas não faça nada como executar várias cópias disso em paralelo.