Введите значение приращения для всех файлов, соответствующих имени файла в подкаталогах

Vader, из вашего комментария к исходному вопросу, вы хотели бы переключиться на интерактивную оболочку с полномочиями суперпользователя, правильно?

У Sudo есть специальный аргумент для запроса оболочки: [ ! d1]

-s [command]
The -s (shell) option runs the shell specified by the SHELL environment variable if
it is set or the shell as specified in the password database. If a command is
specified, it is passed to the shell for execution via the shell's -c option. If no 
command is specified, an interactive shell is executed.

Это позволяет избежать уже упомянутых недостатков безопасности и позволяет «переходить в root» с помощью следующей команды:

sudo -s

ЕСЛИ мне действительно нужно запустить корневую оболочку ( в большинстве случаев я этого не делаю), то мне очень полезно иметь переменную окружения HOME из установленной оболочки (чтобы отразить запуск как «root»), это можно сделать, используя флаг «-H». Таким образом, полная команда будет

sudo -s -H

. Вы можете найти намного больше деталей в man-странице sudo.

1
задан 21 March 2017 в 11:06

2 ответа

Запустите цикл, создающий числа, и команда find -executed прочитает эти числа:

for ((i = 1; ; i++)); do echo $i; done | 
  find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;

Вы также можете использовать seq:

seq 1 inf | find . -type f -name "randomseed.txt" -exec sh -c 'read i; echo $i > "$1"' _ {} \;
3
ответ дан 23 May 2018 в 00:26
  • 1
    В итоге я использовал вариант этого, чтобы сменить имена каталогов аналогичным образом! Спасибо за лидерство, хотя это был не тот, на что был изначально предназначен ваш ответ! – onyinyang 22 March 2017 в 23:13

Вместо использования find вы можете включить globstar, чтобы заставить репликацию оболочки glubing

 shopt -s globstar

cd в родительский каталог этой структуры, а затем проверить (переписать) запись files:

n=0; for i in **; do [[ -d "$i" ]] && echo "echo $((++n)) >" "$i"/randomseed.txt; done

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

n=0; for i in **; do [[ -d "$i" ]] && echo $((++n)) > "$i"/randomseed.txt; done

Возможно, вы захотите отключить globstar, когда это будет сделано:

shopt -u globstar
3
ответ дан 23 May 2018 в 00:26
  • 1
    Единственная проблема с этим для меня в том, что randomseed.txt существует (с другими каталогами) на глубине 2, и я не хочу случайных полей во всех других каталогах (это фактически не повлияло бы на что-либо, но было бы лишним барахлом). Я просто отредактировал ваш скрипт, чтобы указать на конкретный каталог, где randomseed.txt находится внутри структуры, и это сработало отлично! Мне также не нужно было использовать globstar для этого экземпляра. Благодаря! – onyinyang 21 March 2017 в 19:44
  • 2
    @onyinyang о, я вижу - я не мог сказать, что из вашего описания :) Было приятно, спасибо, что задали хороший вопрос :) – Zanna 21 March 2017 в 19:46

Другие вопросы по тегам:

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