#!/bin/bash set -euo pipefail readonly SOURCE_DIR=${1:-$HOME/public_databases} readonly TARGET_DIR=${2:-/mnt/disks/ssd/public_databases} mkdir -p "${TARGET_DIR}" FILES=(pdb_seqres_2022_09_28.fasta \ uniprot_all_2021_04.fa \ mgy_clusters_2022_05.fa \ uniref90_2022_05.fa \ bfd-first_non_consensus_sequences.fasta \ rfam_14_9_clust_seq_id_90_cov_80_rep_seq.fasta \ nt_rna_2023_02_23_clust_seq_id_90_cov_80_rep_seq.fasta \ rnacentral_active_seq_id_90_cov_80_linclust.fasta) NOT_COPIED_FILES=() while (( ${#FILES[@]} )); do # Get total size of files to copy in bytes SOURCE_FILES=( "${FILES[@]/#/${SOURCE_DIR}/}" ) TOTAL_SIZE=$(du -sbc "${SOURCE_FILES[@]}" | awk 'END{print $1}') # Get available space on target drive in bytes AVAILABLE_SPACE=$(df --portability --block-size=1 "$TARGET_DIR" | awk 'END{print $4}') # Compare sizes and copy if enough space if (( TOTAL_SIZE <= AVAILABLE_SPACE )); then printf 'Copying files... %s\n' "${FILES[@]}" echo "From ${SOURCE_DIR} -> ${TARGET_DIR}" for file in "${FILES[@]}"; do cp -r "${SOURCE_DIR}/${file}" "${TARGET_DIR}/" & done break else NOT_COPIED_FILES+=("${FILES[-1]}") unset 'FILES[-1]' fi done printf 'No room left on ssd for: %s\n' "${NOT_COPIED_FILES[@]}" wait