Случайно выбрать 30% файлов в папке

Вы можете использовать findдля рекурсивного получения файлов, а затем sedдля встроенного внесения изменений. Это должно работать, если я правильно понимаю вашу цель:

find. -print0 | xargs -0 sed -i 's/%s/%d/g; s/bcm_errstr(rv)/rv/g;'

Обратите внимание :, что это может соответствовать большему, чем вам нужно, но у вас довольно ограниченное перечисленное целевое поведение. Вам нужно будет настроить часть поиска, чтобы фильтровать только те файлы, на которые вы ориентируетесь.

0
23.09.2019, 13:00
2 ответа
ls | shuf -n $(( $(ls | wc -l) *  30 / 100))

Все, что вам нужно сделать, это найти количество файлов и процент отдельно. Для этого

  1. $(ls | wc -l)сначала подсчитает количество файлов в каталоге
  2. $(( x * 30 /100))выполнит арифметическую операцию по нахождению 30% от этого числа
  3. Наконец, это число передается shuf -nдля получения случайного списка файлов
1
28.01.2020, 02:14

С bash4.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 (не исключает файлы, имена которых начинаются с точки ).
  • GNUsort -Rz:noe['REPLY=$RANDOM'](перетасовать список, отсортировав его в случайном порядке ).
  • ${array[@]:offset:length}->$array[first,last](zsh теперь также поддерживает синтаксис оболочки Korn, но я нахожу zsh более разборчивым ).
  • С bashмы используем записи с разделителями NUL(-d ''/ -z/ \0), чтобы иметь возможность работать с произвольными именами файлов. В zshэто не нужно, так как список никогда не преобразуется в одну строку/поток.
5
28.01.2020, 02:14

Теги

Похожие вопросы