ls -l - groupp-каталоги-перше (діяти також на посиланнях)


9

lsОпція --group-directories-firstпризводить до того, що каталоги будуть вказані у верхній частині, що робить результат lsвигідним і чистим:

ls -l --group-directories-first

Однак він не діє на те symlinks, що є насправді symlinksдо каталогів. Є можливість використовувати

ls -l -L --group-directories-first

який буде перераховувати обидва типи каталогів зверху, але не буде розрізняти належну директорію та каталог, що зв'язаний посиланням, що знову заплутано.

Чи можна lsвідображати каталоги, що мають посилання, зверху, зберігаючи їх на відміну від звичайних каталогів?

EDIT: Я використовую bash.


Це ідіосинкратична поведінка з боку ls. Відповідно до stat()системного виклику, символьне посилання на каталог все ще є каталогом ( S_ISDIR(st_mode)повернеться істинним). Доказово lsзнижує символьні посилання перед тим, як перевірити це.
золотинки

2
@goldilocks, ні, lsне lstat()readlinkдля посилань), якщо ви не скористаєтесь -Lопцією (у цьому випадку вона використовується stat())
Stéphane Chazelas

@StephaneChazelas: Хм, жити та вчитися. Я думав, що S_ISLNK(st_mode)також повертається істина через stat(), але це не так - це робиться тільки через lstat(). Також ISLNK не повертає істину через stat, навіть якщо посилання є посиланням на посилання. Означає, що ISLNKніколи не повернеться істиною через stat, хоча це не визначено ...
goldilocks

@goldilocks, statдає вам властивості файлу в кінці символьних посилань. Якщо цього не існує або він недоступний, він statповертає ENOENT, тому те, що повертається, statніколи не буде символьним посиланням. stat()ніколи не розкаже вам нічого про посилання, як openніколи не відкриє символьне посилання, або chmod()не змінить дозволу символьної посилання ... тощо.
Stéphane Chazelas

Відповіді:


5

Ні, але якщо zshви користуєтесь , ви можете:

mll() {
  (($#)) || set -- *(N-/) *(N^-/)
  (($#)) && ls -ldU -- $@
}

Ви також можете визначити порядок сортування, що складається з глобусу, наприклад:

dir1st() { [[ -d $REPLY ]] && REPLY=1-$REPLY || REPLY=2-$REPLY;}

і використовувати його так:

ls -ldU -- *(o+dir1st)

Таким чином, ви можете використовувати його для інших команд, ніж lsабо lsз різними параметрами, або для різних шаблонів, таких як:

ls -ldU -- .*(o+dir1st) # to list the hidden files and dirs

або:

ls -ldU -- ^*[[:lower:]]*(o+dir1st) # to list the all-uppercase files and dirs

Якщо вам доведеться використовувати bash, еквівалент буде таким:

mll() (
  if (($# == 0)); then
    dirs=() others=()
    shopt -s nullglob
    for f in *; do
      if [[ -d $f ]]; then
        dirs+=("$f")
      else
        others+=("$f")
      fi
    done
    set -- "${dirs[@]}" "${others[@]}"
  fi
  (($#)) && exec ls -ldU -- "$@"
)

bashне має класифікаторів глобалізації або яким-небудь чином впливати на порядок сортування глобусів, або будь-яким способом перетворити nullglob на основі глобальної основі, або не має локального контексту для варіантів (крім запуску підзаголовок, отже, ()замість {}вище) AFAIK .


1
Чи є якийсь подібний трюк для bash?
Мартін Вегтер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.