Попробуйте:
for file in $(find .); do
perm=$(stat -c "%a" ${file});
echo chmod ${perm:0:1}${perm:0:1}${perm:2:1} ${file};
done
Не забудьте удалить ECHO
.
Улучшена версия:
find . -exec sh -c 'for file do
perm=$(stat -Lc "%a" "$file")
echo chmod "${perm:0:1}${perm:0:1}${perm:2:1}" "$file"
done' sh {} +
Как в Ответ Стефана Чазелас ,
- Mindepth 1
Во избежание обработки .
. -максеп 1
, чтобы избежать рекурсиона (ввод подкаталогов). ! -тип л
, чтобы избежать обработки символических ссылок
(Хотя этот ответ будет обрабатывать символические ссылки в порядке). Обратите внимание, что эта команда не будет работать правильно для файлов которые имеют любой из битов режима высокого порядка (SETUID, SETGID и TYCHY).
#!/bin/sh
#make a range of numbers
range=$(seq -s' ' 5)
#make a copy of range
tmp_range=$range
#loop the content
for i in $(echo 2 4 5)
do
#loop the range
for j in $range
do
if [ $i -eq $j ]
then
#delete in the copy if match
tmp_range=$(echo $tmp_range|sed "s/$i//")
#exit this loop and continue the first loop if match
continue 2
fi
done
done
echo $tmp_range
Один образец (и не идеальный) раствор будет выглядит:
for i in `seq 1 5`
do
flag=1
for j in `cat filename_with_numbers`
do
if [ $i -eq $j ]
then flag=0
fi
done
if [ $flag -eq 1 ]
then echo $i
fi
done
comm -13 <(sort file) <(seq 1 5 | sort) | sort -n
Команда com
сообщает об общих строках между (лексически) отсортированными файлами. Без опции она дает три столбца:
Для подавления соответствующих столбцов передаются опции -1
, -2
, -3
. Таким образом, -13
оставляет строки, найденные только в <(seq 1 5 | sort)
output.
Возможным решением может быть следующее:
#!/bin/bash
if [ $# != 3 ]
then
echo "Usage: ./script.sh min_val max_val filename"
exit 1
fi
for ((i=$1;i<=$2;i++))
do
grep -q $i $3
if [ $? -eq 1 ]
then
echo $i
fi
done
Я попробовал это:
#!/bin/bash
i=1
for n in `cat in.txt`
do
if [ $i -ne $n ]
then
echo $i >> result.txt
else
((i++))
fi
done
Вы можете выполнить задачу, просто grep
seq 5 | fgrep -vxf <(tr ' ' '\n' < file)
tr
преобразует строку файла в вывод с одним числом в строке <()
подстановка команды (вывод команды читается как файл) -f
параметр grep
означает, что шаблон (ы) будут читать из файла -x
параметр означает «соответствовать всей строке», например 1
не будет соответствовать параметрам 11
или 21
-v
обратное сопоставление с шаблоном seq
создать список чисел из 1
( опущено по умолчанию) до 5
разделенных новой строкой EDITED:
Если ваш файл уже состоит из 1 числа на 1 строку, вы можете опустить tr
seq 5 | fgrep -vxf file