Как перенести случайный выбор каталогов с внешнего жесткого диска на ноутбук и указать лимит общих данных
Мой ноутбук HD - 120 ГБ SSD. У меня также есть внешний HD ТВ, который я использовал для хранения своей музыки, фотографий и видео. Мне нравится слушать музыку на своем ноутбуке, если я хочу что-то послушать и у меня нет доступа к Интернету (обычно я не ношу с собой внешний HD). Но если бы на моем ноутбуке была вся моя музыкальная коллекция, это заняло бы огромную часть моего свободного места. Я хотел инструмент, который получал случайный выбор альбомов с моего внешнего HD и переносил их в мою музыкальную коллекцию на моем ноутбуке. Для передачи я хотел бы указать только максимальный объем данных, которые я хочу передать. Например, я хотел бы иметь возможность указать, получить мне случайные альбомы на 10 ГБ из музыкальной коллекции на внешнем жестком диске и поместить их в каталог музыки на моем ноутбуке, удаляя при этом то, что ранее было доступно в каталоге музыки на моем ноутбуке. Есть ли инструмент, который может помочь мне достичь этого? Это также было бы полезно для переноса музыки на мой смартфон. PS Я пользователь Ubuntu.
2 ответа
Если вам не нужно ровно 10 ГБ данных, примерно 10 ГБ, но не более, вы можете написать функцию bash, которая делает это. Добавьте эти строки в свой $HOME/.bashrc
файл:
function random_copy(){
size=0;
tries=0;
dirs=();
## The maximum size, change this to whatever you want
limit=10000000
## The maximum number of times we will try to get
## another dir if the current one is too big.
maxtries=20
## While we have not reached the size limit
while [[ $size -lt $limit ]] ; do
## Find a random, non-empty directory from the source.
## sort -R does a random sort and head -n 1 prints the first line.
dir="$(find $1/*/ -not -empty -type d | sort -R | head -n 1)"
## Get this dir's size
dsize=$(du -s "$dir" | cut -f 1)
## If this dir does not make us pass the limit
if [[ $((size + $dsize)) -le $limit ]]; then
echo "Copying $dir" 1>&2
## Copy it to target
cp -r "$dir" $2
## Add its size to $size
let size+=$dsize
## If this dir makes us pass the limit
## try $maxtries times to find another that does not
else
let tries++;
if [[ $tries -gt $maxtries ]]; then
echo "" 1>&2;
echo "Final size = $size"
break;
fi
fi
done;
}
Затем вы можете вызвать функцию, запустив
random_copy /path/to/source /path/to/destination
Например
random_copy ~/Music /tmp/music
ЗАМЕТКИ
- Функция будет искать папки, которые находятся в исходном каталоге. Я предполагаю, что каждый из ваших альбомов находится в отдельной папке.
- Фактический размер, который вы получите, будет отличаться при каждом запуске функции. Если конкретный каталог заставит его пройти ограничение размера, он будет пытаться снова, пока
$maxtries
достигнуто Вы можете контролировать это, изменивmaxtries=20
к тому, что вы хотите.
Используйте инструмент Random Copy.
Случайная копия имеет три режима:
file-based mode
: обычный режим для создания музыкальной коллекции из разных исходных папок.directory-based Mode
: для создания музыкальной коллекции, также основанной на разных исходных каталогах, но в отличном от файлового режима копируется полное содержимое каталога.CD-based Mode
: Особый режим, подходящий для компакт-диска или DVD-диска с песнями, поэтому остается меньше места. Целевые файлы могут быть исходными или волновыми файлами после внутреннего преобразования.
Альтернативный Linux
Один вариант будет для Linux Mix2Stix.
Шаги для установки и как использовать, это описано на странице.
Примечание: Mix2Stix требует Java, который должен быть установлен в системе. Источник включен в дистрибутив.
Использование команды find/cp
find -L ~ -type f -name "*.mp3" | sort -R | tail -n50 | while read file; do cp "$file" /media/<yourdisk>; done
find
Команда будет искать mp3-файлы в вашей папке пользователя ~
, -n50
представляет, сколько файлов будет скопировано.