Как изменить значение в строке существующего скрипта, чтобы оно отражало (числовое) имя папки?

В этом нет ничего особенного, rm -rf *.*— это команда с подстановочным знаком имени файла, она рекурсивно удалит все файлы в текущем каталоге, имена которых содержат точку.

rm -rf /выдаст ошибку при попытке запуска rmв корневом каталоге. Это предписано POSIX :

.

If [...] an operand resolves to the root directory, rm shall write a diagnostic message to standard error and do nothing more with such operands.

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

Ни один из них не повредит файловую систему, rmтолько (попытается )удалить файлы, используя обычные вызовы файловой системы. Воздействие на систему в целом или файлы пользователя, конечно, может быть существенным, если первая команда выполняется в каталоге, содержащем важные файлы.

0
24.02.2020, 02:06
1 ответ

Вот решение ed(1)и оболочка for loop.

Эд должен изменить строку номер девять и заменить Xименем каталога.


Я создал небольшой сценарий, чтобы показать, как это делается.

Создайте каталог testing внутри /tmp плюс пустые каталоги с 0 по 41

mkdir -p /tmp/testing/{0..41}

Проверить каталоги

ls /tmp/testing
0/  1/  10/ 11/ 12/ 13/ 14/ 15/ 16/ 17/ 18/ 19/ 2/  20/ 21/ 22/ 23/ 24/ 25/ 26/ 27/ 28/ 29/ 3/  30/ 31/ 32/ 33/ 34/ 35/ 36/ 37/ 38/ 39/ 4/  40/ 41/ 5/  6/  7/  8/  9/ 

Создайте несколько файлов и запишите в них содержимое.

for d in /tmp/testing/*/; do
  printf '%s\n' {1..20}'#SBATCH -J aXau19' > "$d"/myscript$RANDOM$RANDOM$RANDOM.sh
done

Проверьте новые созданные файлы.

ls /tmp/testing/*
/tmp/testing/0:
myscript11901287773897.sh

/tmp/testing/1:
myscript22167100654321.sh

/tmp/testing/10:
myscript267471903230794.sh

/tmp/testing/11:
myscript21767360022483.sh

/tmp/testing/12:
myscript282132941319693.sh

/tmp/testing/13:
myscript6970151065611.sh

/tmp/testing/14:
myscript11068731012744.sh

/tmp/testing/15:
myscript19107175771.sh

/tmp/testing/16:
myscript12252298818021.sh

/tmp/testing/17:
myscript105202172129231.sh

/tmp/testing/18:
myscript2567385425240.sh

/tmp/testing/19:
myscript29570230212538.sh

/tmp/testing/2:
myscript11241700021570.sh

/tmp/testing/20:
myscript31918599925170.sh

/tmp/testing/21:
myscript21633144421815.sh

/tmp/testing/22:
myscript855984144154.sh

/tmp/testing/23:
myscript141701948311464.sh

/tmp/testing/24:
myscript26914582213221.sh

/tmp/testing/25:
myscript269851807416209.sh

/tmp/testing/26:
myscript12238285945162.sh

/tmp/testing/27:
myscript8701215006016.sh

/tmp/testing/28:
myscript11741830229037.sh

/tmp/testing/29:
myscript37121942613269.sh

/tmp/testing/3:
myscript252821857619268.sh

/tmp/testing/30:
myscript17684744220712.sh

/tmp/testing/31:
myscript67311600129127.sh

/tmp/testing/32:
myscript108853017115842.sh

/tmp/testing/33:
myscript223492431721664.sh

/tmp/testing/34:
myscript2802185356971.sh

/tmp/testing/35:
myscript19012307732797.sh

/tmp/testing/36:
myscript24174670724297.sh

/tmp/testing/37:
myscript3019178819832.sh

/tmp/testing/38:
myscript264601159329258.sh

/tmp/testing/39:
myscript6962410715067.sh

/tmp/testing/4:
myscript262302179122509.sh

/tmp/testing/40:
myscript14175285225742.sh

/tmp/testing/41:
myscript1053466403145.sh

/tmp/testing/5:
myscript263762898927462.sh

/tmp/testing/6:
myscript152723179213229.sh

/tmp/testing/7:
myscript222431803611235.sh

/tmp/testing/8:
myscript25041944217942.sh

/tmp/testing/9:
myscript16570686525823.sh

Проверьте содержимое файлов.

tail -n+1 /tmp/testing/*/*.sh

Каждый файл содержит следующее

1#SBATCH -J aXau19
2#SBATCH -J aXau19
3#SBATCH -J aXau19
4#SBATCH -J aXau19
5#SBATCH -J aXau19
6#SBATCH -J aXau19
7#SBATCH -J aXau19
8#SBATCH -J aXau19
9#SBATCH -J aXau19
10#SBATCH -J aXau19
11#SBATCH -J aXau19
12#SBATCH -J aXau19
13#SBATCH -J aXau19
14#SBATCH -J aXau19
15#SBATCH -J aXau19
16#SBATCH -J aXau19
17#SBATCH -J aXau19
18#SBATCH -J aXau19
19#SBATCH -J aXau19
20#SBATCH -J aXau19

Теперь редактируем файлы.

for d in /tmp/testing/*/*.sh; do
  printf '%s\n' "9,s/X/${d##*/}/" w | ed -s "$d"
done

Проверьте содержимое файлов, которые были отредактированыed(1)

tail -n+1 /tmp/testing/*/*.sh

Насколько я понимаю ваш вопрос, это то, что вы пытаетесь сделать, за вычетом требования vi/vim.

0
28.04.2021, 23:22

Теги

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