shell script создающий пустые файлы со всеми возможными правами доступа
Как написать shell script, который создаёт пустые файлы со всеми возможными правами доступа. Имена файлов должны быть например такими: rwxrw_r__.txt. Знаю, как это сделать вручную. Как пример:
#!/bin/bash
touch task5/rwxrwxrwx.txt | chmod 777 task5/rwxrwxrwx.txt
touch task5/rwxr-xr-x.txt | chmod 755 task5/rwxr-xr-x.txt
touch task5/rwx------.txt | chmod 700 task5/rwx------.txt
touch task5/rw-rw-rw-.txt | chmod 666 task5/rw-rw-rw-.txt
touch task5/rw-r--r--.txt | chmod 644 task5/rw-r--r--.txt
touch task5/rw-------.txt | chmod 600 task5/rw-------.txt
НО как написать скрипт, который сам создаст по нужному шаблону текстовые файлы, и даст им права? Ecть такое решение:
p=( --- --x -w- -wx r-- r-x rw- rwx ) # the set of permissions
for u in "${p[@]}"; do for g in "${p[@]}"; do for o in
"${p[@]}";
do
f="task5/$u$g$o.txt"; touch -- "$f" && chmod "u=$u,g=$g,o=$o" --
"$f"
done; done; done
Оно создаёт имена верно, но разрешения, которые даются иногда не совпадают с именами. Может, кто поможет откорректировать этот код?
Ответы (1 шт):
paste <(echo {0..7}{0..7}{0..7} |tr ' ' '\n') <(echo {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x} |tr ' ' '\n') |awk '{z="-- "$2".txt";system("touch "z" && chmod "$1" "z)}'
с помощью paste сопоставляем столбцы полученные от перебора всевозможных значений для {0..7}{0..7}{0..7} и {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x}
на выход получим примерно следующее:
000 ---------
001 --------x
...
774 rwxrwxr--
775 rwxrwxr-x
776 rwxrwxrw-
777 rwxrwxrwx
всего порядка 512 строк.
далее с помощью awk перебираем полученные данные создавая файлы имена которых соответствуют значениям из второго столбца, а права доступа с первого.
п.с.
если есть ограничения на открытие большого количества файлов то попробуйте один из вариантов:
paste <(echo {0..7}{0..7}{0..7} |tr ' ' '\n') <(echo {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x} |tr ' ' '\n') |awk '{z="-- "$2".txt";system("touch "z" && chmod "$1" "z);close($2".txt")}'
paste <(echo {0..7}{0..7}{0..7} |tr ' ' '\n') <(echo {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x} |tr ' ' '\n') |awk '{z="-- "$2".txt";x=system("touch "z" && chmod "$1" "z);close(x)}'
paste <(echo {0..7}{0..7}{0..7} |tr ' ' '\n') <(echo {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x} |tr ' ' '\n') |awk '{z="-- "$2".txt";x=("touch "z" && chmod "$1" "z); x|getline; close(x)}'
где мы используем функцию close() для закрытия после каждого прохода.
п.с.2 еще один вариант:
paste <(echo {0..7}{0..7}{0..7} |tr ' ' '\n') <(echo {-,r}{-,w}{-,x}{-,r}{-,w}{-,x}{-,r}{-,w}{-,x} |tr ' ' '\n')| while read i; do eval $(echo "$i" |awk '{print "a="$1";b="$2}');touch -- $b".txt" && chmod $a -- $b".txt" ;done