Вы можете использовать find
для рекурсивного получения файлов, а затем sed
для встроенного внесения изменений. Это должно работать, если я правильно понимаю вашу цель:
find. -print0 | xargs -0 sed -i 's/%s/%d/g; s/bcm_errstr(rv)/rv/g;'
Обратите внимание :, что это может соответствовать большему, чем вам нужно, но у вас довольно ограниченное перечисленное целевое поведение. Вам нужно будет настроить часть поиска, чтобы фильтровать только те файлы, на которые вы ориентируетесь.
ls | shuf -n $(( $(ls | wc -l) * 30 / 100))
Все, что вам нужно сделать, это найти количество файлов и процент отдельно. Для этого
$(ls | wc -l)
сначала подсчитает количество файлов в каталоге $(( x * 30 /100))
выполнит арифметическую операцию по нахождению 30% от этого числа shuf -n
для получения случайного списка файлов С 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
это не нужно, так как список никогда не преобразуется в одну строку/поток.