Регистрация ksh, если каталог пуст

Прошлый раз, когда сайт был обновлен, был 2009, но это не означает, что это мертво. Нечастые обновления не делают мужчин, проект мертв просто, что он не имеет недавнего обновления.

Рабочий стол танго является довольно далеко идущим, и на самом деле влиял на многие вещи на сегодняшнем DES.

Помните, что Рабочий стол Танго является большим количеством инициативы затем, это - часть программного обеспечения. Так Вы вид выяснения, если html 4 мертв. Это, возможно, не было обновлено в долгое время, но это совсем не мертво.

Многие, многие (реальная действительность больше всего) современные проекты следуют за целями Настольного Проекта Танго. Также, как и "большинство" DES и современные инструкции UI.

Проект все еще важен, все еще релевантен, но просто не нужен в наборе обновлений для хранения его так.

3
11.02.2015, 11:22
6 ответов

вот позывный способ тестирования того, является ли DIR Только встроенные конструкции оболочки. Команда SET устанавливает позиционные аргументы для точек файлов (включая всегда существующие . и .. ), а затем неточные файлы. Если каталог пуст, то . * Глобус только совпадает только . .. .. , а и * Матч совсем нет, так что остается невыполненным.

set dir/.* dir/*
[ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ]

Это работает на att ksh, но не удается с некоторыми снарядами, которые опускают . и .. записи. Чтобы быть более портативным, вам нужно также разрешить . * ничего не соответствует.

set dir/.* dir/*
case $# in
  0) true;; # can't happen in a standard shell, this is for shells with nullglob
  2) { [ "$1" = "dir/.*" ] && [ "$2" = "dir/*" ] && ! [ -e "$1" ] && ! [ -L "$1" ] && ! [ -e "$2" ] && ! [ -L "$2" ]; } ||
     { [ "$1" = "dir/." ] && [ "$2" = "dir/.." ]; };;
  3) [ "$1" = "dir/." ] && [ "$2" = "dir/.." ] && ! [ -e "$3" ] && ! [ -L "$3" ];;
  *) false;;
esac

Последние версии KSH позволяют проще тестировать, но я думаю, что AIX слишком старый (даже его ksh93 ). Вот как вы можете проверить, является ли DIR в недавнем достаточном количестве KSH93:

FIGNORE='.?(.)'; set -- ~(N)dir/*; [[ $# -eq 0 ]]

или альтернативно

FIGNORE=; set -- dir/*; [[ $# -eq 2 ]]

альтернативный подход - это позвонить Найти . Это проще в том, что Найти не относится к точкам файлам специально и не имеет ничего подобного сложности оболочки, чтобы различать шаблон, который соответствует одному файлу и шаблону, который оставлен нерешенным, потому что это ничего не совпадает Отказ

[ -z "$(find dir/. -name . -o -print | head -n 1)" ]
2
27.01.2020, 21:27

Я не знаю прямого пути, и это также зависит от того, хотите ли вы, чтобы файлы с точками также рассматривались. Это (или его вариант) может сделать то, что вы хотите...

set directory/*
[[ -f $1 ]] || print empty
0
27.01.2020, 21:27

В любой оболочке [ "$(find path_to_dir -mindepth 1)"] || echo EMPTY

0
27.01.2020, 21:27

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

set di[r]/* di[r]/.[!.]* di[r]/..?*
case $* in 
(*r/*) echo dir not empty;;
(*]/*) echo dir is empty ;;
esac

Это работает потому, что если путь разрешается для любого из трех глобусов, которые не соответствуют dir/. или dir/... - тогда ди[r] глобус также должен разрешаться, но результаты не могут расширить /. Вышеуказанное должно работать для любого из posh, ksh, bash, dash, mksh, yash, mksh, или busybox ash. Это также будет работать для zsh, если установлена эмуляция sh. Следующее также работает для большинства из них - все за исключением posh и mksh, насколько я знаю - и должны работать для всех POSIX оболочек:

Для текущей директории вы можете сделать:

set "/./${PWD##*/}/"
set "$1" .?"$1"* .?"$1".[!.]* .?"$1"..?*
case $* in (*.././*) set "$1";;esac
printf "%s%${2+.}3sempty\n" "${1#/} " "is not "

...которая не имеет проблемы с разрешением на чтение/поиск, потому что все глобусы разрешают для текущей директории - хотя они повторяются. Опять же, немного пополняется:

ksh -x <<\SCRIPT  
dirempty(){
    cd -P -- "${1-.}" && set "/./${PWD##*/}/" || return 2
    set .?"$1"* .?"$1".[!.]* .?"$1"..?*
    case $* in (*.././*) set --;;esac
    printf "%s%${1+.}2s empty\n" "$PWD " "is not"
    cd -- "$OLDPWD" && return "$((!$#))"
}

###TEST LOOP###

    mkdir empty
    for new in "" ... notdot
    do  for c in touch mkdir
        do  "$c" "empty/$new" 2>&3
            dirempty empty ||
            rm -rf "empty/$new"
        done 
    done 3>/dev/null

###END
SCRIPT

Вот некоторые из выходных данных -x:

+ touch empty/
+ dirempty empty
+ cd -P -- empty
+ set /./empty/
+ set '.?/./empty/*' '.?/./empty/.[!.]*' '.?/./empty/..?*'
+ printf '%s%.2s empty\n' '/home/mikeserv/empty/ ' 'is not'
/home/mikeserv/empty/ is empty
+ cd -- /home/mikeserv
+ return 0

Это следующая строка, показывающая, как она работает лучше всего:

... '.?/./empty/*' '.?/./empty/.[!.]*' '.?/./empty/..?*' ...

... потому что для каждой из *, . [!] *, и ...?*, целое отчество недействительно, тогда как и каждая часть так не глобусы решают - включить ведущее ...?. Сравните это с этой же секцией из того же вывода...

+ touch empty/...
...
+ set /./empty/
+ set '.?/./empty/*' '.?/./empty/.[!.]*' .././empty/...
+ set --
+ printf '%s%2s empty\n' '/home/mikeserv/empty/ ' 'is not'
/home/mikeserv/empty/ is not empty
+ cd -- /home/mikeserv
+ return 1

Смотри...?

'.?/./empty/*' '.?/./empty/.[!.]*' .././empty/...

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

case $* in (*.././*)

И так можно просто проверить, что глобус разрешает (и так же надежно проверить любое содержимое каталога) - просто сравните неизвестное с известным.

0
27.01.2020, 21:27

Вот функция, которая работает во многих Unix,

в Bourne-совместимых оболочках (даже в доисторических моделях),

и не углубляется слишком глубоко (файловая система, ЦП и мозг):

isempty() { [ -z "`find \"$1/.\" ! -name . -print -prune | head -1`" ] ; }
0
27.01.2020, 21:27

Возможно, я что-то проглядел, но это тоже должно работать и, ИМХО, более читабельно, чем set или find.

-A просто исключить . и ... , но включаем другие дотфайлы.

| head -n 5 сокращает ls в случае большого количества файлов. Вы можете опустить его, если ожидаете, что в проверяемых папках нет или мало файлов. Edit : Я обновил до 5, чтобы мы могли справиться с корявыми именами файлов, начинающимися с новой строки (строк).

if [ -z "$(ls -A /path/to/folder | head -n 5)" ] 
then 
    print "EMPTY"
else 
    print "NOT EMPTY"
fi

Проверено на AIX 7.1

0
27.01.2020, 21:27

Теги

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