С bash
4.4+ и в системе GNU вы можете сделать:
readarray -td '' files < <(
shopt -s nullglob dotglob
printf '%s\0' * | sort -Rz
)
для заполнения массива $files
перемешанным списком всех файлов в текущем каталоге.
Затем вы можете переместить 30% из них с помощью чего-то вроде:
echo mv -- "${files[@]:0:${#files[@]}*30/100}" /target/directory/
(удалите echo
когда вы будете уверены, что он будет делать то, что вы хотите ).
Эквивалентом в оболочке zsh
может быть что-то вроде:
files=(*(NDnoe['REPLY=$RANDOM']))
echo mv -- $files[1,$#files*30/100] /target/directory/
Тот же подход, только более лаконичный и не требующий внешних утилит. Перевод:
shopt -s nullglob
-> N
квалификатор glob (создает пустой массив, когда файла нет ). shopt -s dotglob
-> D
квалификатор glob (не исключает файлы, имена которых начинаются с точки ). sort -Rz
:noe['REPLY=$RANDOM']
(перетасовать список, отсортировав его в случайном порядке ). ${array[@]:offset:length}
->$array[first,last]
(zsh теперь также поддерживает синтаксис оболочки Korn, но я нахожу zsh более разборчивым ). bash
мы используем записи с разделителями NUL(-d ''
/ -z
/ \0
), чтобы иметь возможность работать с произвольными именами файлов. В zsh
это не нужно, так как список никогда не преобразуется в одну строку/поток. Вы можете использовать find
с mtime
/ ctime
/ atime
для времени модификации, изменения метаданных или доступа и +14
в течение двух недель.
find <path> -type f -ctime +14 -delete
(Я предлагаю сначала протестировать это с помощью -print
вместо -delete
, чтобы убедиться, что все работает правильно.)