Перебирать файлы в каталоге - сохранять их имя в файл и затем менять имя

Системный раздел EFI — это раздел, о котором знает прошивка EFI (в ПЗУ на материнской плате ), и из которого прошивка может загружать приложения EFI, такие как загрузчики. Таким образом, ESP — это место, куда вы помещаете GRUB2 для загрузки и запуска прошивки. Как вы сказали, каталог/раздел /boot— это место, где GRUB может найти нужные ему файлы. Однако нет причин, по которым ESP и /bootне могут быть одним и тем же разделом.

1
09.09.2019, 15:15
2 ответа

С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

Где квалификатор oeglob определяет порядок расширения глобуса на основе оценки предоставленного выражения (, которое здесь возвращает случайное число от 0 до 32767 ), что в результате дает вам перетасованное как файлы.

Затем мы переименовываем эти файлы в указанном порядке по возрастанию, чтобы это работало независимо от того, сколько файлов находится в каталоге.

0
27.01.2020, 23:22

Основная трудность в этом упражнении заключается в создании уникального случайного числа для каждого из 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
3
27.01.2020, 23:22

Теги

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