Отменить изменение имени файла с помощью команды find?

Для ядра Linux требуется sudoдля /proc//pagemap, начиная с версии 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 на ноль.

3
01.09.2020, 11:28
4 ответа

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

2
18.03.2021, 23:08

на реверс:

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 '{}' \;
2
18.03.2021, 23:08

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
0
18.03.2021, 23:08
find. -depth -name '*.yo' -exec sh -c '
  ret=0
  for file do
    mv -i -- "$file" "${file%.yo}" || ret=$?
  done
  exit "$ret"' sh {} +

Это переименование всех file.yoфайлов (любого типа, включая каталог, как в команде, которую вы использовали для добавления суффикса .yofileбез .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или zshzmv.

В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.

5
18.03.2021, 23:08

Теги

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