Для ядра Linux требуется sudo
для /proc/
, начиная с версии 4.0
Это задокументировано в :https://github.com/torvalds/linux/blob/v4.9/Documentation/vm/pagemap.txt
Since Linux 4.0 only users with the CAP_SYS_ADMIN capability can get PFNs.
In 4.0 and 4.1 opens by unprivileged fail with -EPERM. Starting from
4.2 the PFN field is zeroed if the user does not have CAP_SYS_ADMIN.
Reason: information about PFNs helps in exploiting Rowhammer vulnerability.
Где CAP_SYS_ADMIN
в основном означает «запускать как sudo
», или альтернативно:
sudo setcap cap_sys_admin+ep program_that_uses_pagemap
./program_that_uses_pagemap
Имейте в виду, что/proc
— это виртуальная файловая система , поэтому ядро Linux может принудительно применять дополнительные разрешения или даже произвольно изменять результаты для пользователей без полномочий root, как это делается здесь из соображений безопасности, устанавливая PFN на ноль.
yu../
Нет такого файла или каталога.
попробуй это
find * -type f -exec echo {} pref_{} \;
*
звездочка расширяется на все файлы в текущем каталоге без каталога,
если есть подкаталоги используйте опцию -prune
, не спускайтесь в нее
есть и такая конструкция
find -type f -exec bash -c 'echo $0 ${0%%/*}/pref_${0##*/}' {} \;
но в нем позиционные переменные начинают свой отсчет с $0, то есть все файлы находящиеся в {$0 $1 $2...} +
или{$0} \;
Соответственно, количество файлов можно считать следующим образом
find -type f -exec bash -c 'echo $#' 1 {} +
И вы можете отображать все файлы вот так
find -type f -exec bash -c 'echo $@' 1 {} +
Здесь вместо одного можно использовать любой символ или слово без пробелов. Это будет означать еще один дополнительный файл в переменной $0
на реверс:
find -name "*" -exec mv {} {}.yo \;
простым способом может быть:
Сначала создайте скрипт "unyo.bash"
#!/usr/bin/env bash
for name in "$@"; do
mv "$name" "${name%.yo}"
done
Затем используйте его для удаления ваших файлов:
find -name "*.yo" -print0 | xargs -0 /path/to/unyo.bash
Если у вас нет «print0» и «xargs -0», вам может понадобиться делать их по одному (неэффективно, так как каждый раз порождается bash):
find -name "*.yo" -exec /path/to/unyo.bash '{}' \;
Now here's the though part I am not able to get - if have to undo above operation, how do I do it?
Вы можете использовать приведенную ниже команду.
for FILENAME in `find. -name "*.yo"`; do mv "$FILENAME" $(echo "$FILENAME" | sed -e 's/\.[^.]*$//'); done
find. -depth -name '*.yo' -exec sh -c '
ret=0
for file do
mv -i -- "$file" "${file%.yo}" || ret=$?
done
exit "$ret"' sh {} +
Это переименование всех file.yo
файлов (любого типа, включая каталог, как в команде, которую вы использовали для добавления суффикса .yo
)в file
без .yo
. Мы делаем это сначала в глубину (уходит до ветки, на которой они находятся ), в противном случае, если вы сначала переименуете dir.yo
в dir
, когда мы переименуем dir.yo/file.yo
в dir.yo/file
, это победит. t не работает, так как dir.yo
больше не существует.
При использовании пакетного переименования -depth
почти всегда лучше, поэтому рекомендуется всегда использовать его, единственное, что нужно иметь в виду, это то, что оно несовместимо с -prune
.
Префикс mv {} prefix{}
не работает, потому что {}
содержит полный путь, включая компоненты каталога, а вы хотите добавить префикс к имени файла, поэтому вам понадобится что-то вроде:
find. -depth -type f -exec sh -c '
ret=0
for file do
dir=${file%/*} name=${file##*/}
mv -i -- "$file" "$dir/yu.$name" || ret=$?
done
exit "$ret"' sh {} +
На этот раз мы используем -type f
только для переименования обычных файлов, исключая все другие типы файлов, включая каталоги , fifos , устройства , символические ссылки и т. д.
Вместо того, чтобы делать подобные вещи вручную, я бы предложил использовать специальные инструменты пакетного переименования, такие как mmv
или zsh
zmv
.
Вzsh
:
autoload -Uz zmv
zmv '(**/)(*).yo(#qD)' '$1$2' # remove.yo suffix
zmv '(**/)(*)(#qD.)' '${1}yu.$2' # add yu. prefix to regular files
(#q...)
для квалификаторов glob , где D
указывает zmv также учитывать скрытые файлы или файлы в скрытых каталогах, как find
по умолчанию, а .
эквивалентно find
-type f
.