bash перебирает список файлов, кроме пустого

Примечание: Я записал это несколько часов назад, но я нахожусь в пути Sandy, таким образом, я ушел и забыл нажимать кнопку отправки

Таким образом, существует два способа выполнить это, и оба делают что-то другое. Будет невозможным действительно заблокировать Facebook, поскольку любой мог использовать сайт прокси и обойти Ваши ограничения. Они могли также туннель SSH к серверу, который не ограничивается. Тем не менее, здесь мы идем...

iptables

bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.247.21 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 66.220.149.88 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 66.220.152.16 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.234.21 --dport 443 -j REJECT
bash$ sudo iptables -A OUTPUT -p tcp -d 69.171.237.16 --dport 443 -j REJECT

Оборотная сторона, это не мешает Facebook добавить новый IP-адрес для facebook.com для разрешения к. Вы могли записать сценарий для постоянного выполнения и получить последнее:

#!/bin/bash
for i in $(host facebook.com | grep "has address " | cut -d' ' -f4)
do iptables -A OUTPUT -p tcp -d $i --dport 443 -j REJECT
done

Примечание: этому действительно нужно немного модификации, поскольку она может произвести ошибки

DNS

Это решение не идеально также. DNS является просто основой системы именования, поражение IP-адреса непосредственно победило бы. При владении Внутренним сервером имен для сети Вы могли бы установить запись для facebook.com для разрешения где-то в другом месте. Я использовал бы это в сочетании с iptables один выше.

sslstrip - не рекомендуемый вообще

Мы могли даже пойти один шаг вперед. При владении всеми машинами в сети, для которой Вы пытаетесь заблокировать Facebook, Вы могли генерировать Корень сертификат CA, установить открытый ключ на всех машинах. Man-in-the-middle весь трафик SSL оставляет все веб-сайты с Вашими сертификатами и активно уничтожает соединения Facebook. Однако это - опасная идея и имеет последствия конфиденциальности (особенно в корпоративной среде).

34
30.10.2015, 16:05
4 ответа

В bash вы можете установить параметр nullglob , чтобы шаблон, который не соответствует ничему, «исчезал», а не обрабатывался как литерал строка:

shopt -s nullglob
for fname in *.zip ; do
   echo "current file is ${fname}"
done

В сценарии оболочки POSIX вы просто проверяете, что fname существует (и одновременно с [-f] , проверьте, что это обычный файл (или символическая ссылка на обычный файл), а не другие типы, такие как directory / fifo / device ...):

for fname in *.zip; do
    [ -f "$fname" ] || continue
    printf '%s\n' "current file is $fname"
done

Замените [-f "$ fname"] на [-e "$ fname"] || [-L "$ fname] , если вы хотите перебрать все (не скрытые) файлы, имена которых заканчиваются на .zip , независимо от их типа.

Замените *. zip с . *. zip .zip * .zip , если вы также хотите учитывать скрытые файлы, имена которых заканчиваются на .zip .

37
27.01.2020, 19:37

Для этого используйте команду find

export -f myshellfunc
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec bash -c 'myshellfunc "$0"' {} \;

НЕОБХОДИМО экспортировать функцию оболочки с помощью export -f . Теперь find выполняет bash , который выполняет функцию оболочки, и остается только на текущем уровне dir.

-121--13287-

Исправил это некоторое время назад, подумал, что опубликовал это здесь. Все, что мне нужно было сделать, это установить ОС как один раздел, по какой-то причине она отформатировала другие каталоги неправильного размера.

-121--27346-

Вместо:

FILES=`ls *.zip`

Попробуйте:

FILES=`ls * | grep *.zip`

В этом пути при сбое ls (что и происходит в вашем случае) он будет возвращен в виде пустой переменной.

current file is      <---Blank Here

Можно добавить к этому некоторую логику, чтобы вернуть значение «No File Found»

#!/bin/bash

FILES=`ls * | grep *.zip`
if [[ $? == "0" ]]; then
    for fname in "$FILES" ; do
        echo current file is $fname
    done
else
    echo "No Files Found"
fi

Этот путь, если предыдущая команда выполнена успешно (с 0 значением), то она распечатает текущий файл, в противном случае - «No Files Found»

-3
27.01.2020, 19:37

Используйте find

export -f myshellfunc
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec bash -c 'myshellfunc "$0"' {} \;

Вы ДОЛЖНЫ экспортировать свою функцию оболочки с помощью export -f, чтобы это сработало. Теперь find выполняет bash, который выполняет вашу функцию оболочки, и остается только на уровне текущего dir.

2
27.01.2020, 19:37
set ./*                               #set the arg array to glob results
${2+":"} [ -e "$1" ] &&               #if more than one result skip the stat "$1"
printf "current file is %s\n" "$@"    #print the whole array at once

###or###

${2+":"} [ -e "$1" ] &&               #same kind of test
for    fname                          #iterate singly on $fname var for array
do     printf "file is %s\n" "$fname" #print each $fname for each iteration
done                                  

В одном из комментариев здесь вы упоминаете вызов функции...

file_fn()
    if     [ -e "$1" ] ||               #check if first argument exists
           [ -L "$1" ]                  #or else if it is at least a broken link
    then   for  f                       #if so iterate on "$f"
           do : something w/ "$f"
           done
    else   command <"${1-/dev/null}"    #only fail w/ error if at least one arg
    fi

 file_fn *
2
27.01.2020, 19:37

Теги

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