Системный раздел EFI — это раздел, о котором знает прошивка EFI (в ПЗУ на материнской плате ), и из которого прошивка может загружать приложения EFI, такие как загрузчики. Таким образом, ESP — это место, куда вы помещаете GRUB2 для загрузки и запуска прошивки. Как вы сказали, каталог/раздел /boot
— это место, где GRUB может найти нужные ему файлы. Однако нет причин, по которым ESP и /boot
не могут быть одним и тем же разделом.
Сzsh
:
n=0; for f in dir/*(noe['REPLY=$RANDOM']); do
mv -i -- $f $f:h/$((++n)) &&
print -r -- $f was renamed to $n
done > result.txt
Где квалификатор oe
glob определяет порядок расширения глобуса на основе оценки предоставленного выражения (, которое здесь возвращает случайное число от 0 до 32767 ), что в результате дает вам перетасованное как файлы.
Затем мы переименовываем эти файлы в указанном порядке по возрастанию, чтобы это работало независимо от того, сколько файлов находится в каталоге.
Основная трудность в этом упражнении заключается в создании уникального случайного числа для каждого из 100 файлов. Решение этой проблемы состоит в том, чтобы сгенерировать числа, которые, как мы знаем, нам нужны (от 1 до 100 ), а затем зашифровать их (или зашифровать список имен файлов )перед соединением числа с именем файла. Чего вы не хотите в конечном итоге делать, так это бросать свои 100 -боковых кубиков, проверять, не выпало ли уже это число, и перебрасывать -, если да, пока не получите число, которого у вас нет. катался раньше. Для большого количества файлов эта процедура может занять очень много времени . (Забавный факт, несколько лет назад мы использовали этот вопрос в интервью ).
Предполагая, что имя файла не содержит встроенных символов новой строки:
paste <( printf '%d\n' {1..100} ) <( printf '%s\n' dir/* | sort -R ) >result.txt
Это создаст два столбца -с разделителями табуляцией с помощью утилиты paste
. Первый столбец содержит целые числа от 1 до 100 по порядку. Второй столбец содержит имена 100 файлов в каталоге dir
(, включая имя каталога ). Список имен отсортирован в случайном порядке (вариант -R
для sort
не является -стандартным, но общедоступным ).
Вы также можете оставить имена файлов отсортированными и вместо этого зашифровать целые числа:
paste <( printf '%d\n' {1..100} | sort -R ) <( printf '%s\n' dir/* ) >result.txt
Чтобы изменить имена файлов, прочтите файл result.txt
:
while IFS= read -r stuff; do
number=${stuff%%$'\t'*} # the thing before the first tab
pathname=${stuff#*$'\t'} # the thing after the first tab
mv -i -- "$pathname" "$(dirname -- "$pathname")/$number"
done <result.txt
Запуск этого для всех подкаталогов в текущем каталоге (подумайте перед запуском этого и всегда сохраняйте резервную копию важных данных):
for dirpath in */; do
paste <( printf '%d\n' {1..100} | sort -R ) <( printf '%s\n' "$dirpath"/* )
done >result.txt
while IFS= read -r stuff; do
number=${stuff%%$'\t'*}
pathname=${stuff#*$'\t'}
mv -i -- "$pathname" "$(dirname -- "$pathname")/$number"
done <result.txt
или, более обтекаемый,
for dirpath in */; do
paste <( printf '%d\n' {1..100} | sort -R ) <( printf '%s\n' "$dirpath"/* )
done |
tee result.txt |
while IFS= read -r stuff; do
number=${stuff%%$'\t'*}
pathname=${stuff#*$'\t'}
mv -i -- "$pathname" "$(dirname -- "$pathname")/$number"
done