Найдите все числа не в диапазоне

Попробуйте:

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

-1
01.02.2015, 15:15
6 ответов
#!/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
0
28.01.2020, 05:09

Один образец (и не идеальный) раствор будет выглядит:

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
0
28.01.2020, 05:09
comm -13 <(sort file) <(seq 1 5 | sort) | sort -n

Команда com сообщает об общих строках между (лексически) отсортированными файлами. Без опции она дает три столбца:

  1. Строки, найденные только в первом файле
  2. Строки, найденные только во втором файле
  3. Строки, общие для обоих файлов.

Для подавления соответствующих столбцов передаются опции -1, -2, -3. Таким образом, -13 оставляет строки, найденные только в <(seq 1 5 | sort) output.

1
28.01.2020, 05:09

Возможным решением может быть следующее:

#!/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 
0
28.01.2020, 05:09

Я попробовал это:

#!/bin/bash
i=1
for n in `cat in.txt`
do
    if [ $i -ne $n ]
    then
        echo $i >> result.txt
    else
        ((i++))
    fi
done
0
28.01.2020, 05:09

Вы можете выполнить задачу, просто 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
1
28.01.2020, 05:09

Теги

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