Циклическое отображение файлов листинга в UNIX

Циклическое отображение файлов листинга в UNIX

Я отдал команду:

ls -lrt

а перечисленные файлы и каталоги:

drwxr-xr-x   4 root root    4096 Feb  2  2014 abc
drwxr-xr-x   4 root root    4096 Feb  2  2014 cde
drwxr-xr-x   4 root root    4096 Feb  2  2014 efg
-rwxr-xr-x   4 root root    4096 Feb  2  2014 aaa.txt

Теперь я хочу выяснить, являются ли перечисленные выходные файлы каталогами или нет, используя цикл for или цикл while.

решение1

С lsпомощью приведенной ниже команды можно вывести список только каталогов.

ls -d -- */

Чтобы вывести список обычных файлов с помощью самой команды ls (и при условии, что имена файлов не содержат символов новой строки), можно использовать следующую команду.

ls -p | grep -v /

Чтобы вывести список только обычных файлов с помощью GNU и нескольких других реализаций find, вы можете использовать

find . -maxdepth 1 -type f

(обратите внимание, что в отличие от предыдущего, он также включает скрытые файлы, и список не сортируется)

Стандартный эквивалент будет таким:

find . ! -name . -prune -type f

решение2

Если вам нужно что-то вроде «шаблона скрипта оболочки» для того, как перебирать содержимое каталога и выполнять действия в зависимости от типа файла, следующее может вам подсказать:

for f in *
do
   if [[ -d "$f" ]]
   then
      ... your processing of directories here, reference them as "$f" ...
   fi
done

Это просмотрит все записи в текущем каталоге, проверит, являются ли они каталогами, и выполнит любую обработку, которую вы захотите. Обратите внимание, что синтаксис для проверки каталога специфичен для BASH; в общем случае используйте if [ -d "$f" ].

Другой подход ограничит список только записями каталога:

for d in */
do
    ... whatever you need to do on directory "$d" ...
done

решение3

Вам не понадобится цикл для поиска всех каталогов, findвместо этого вы можете использовать команду:

find . -maxdepth 1 -type d

Это выведет список всех каталогов в текущем каталоге. Если вам нужен вывод, ls -lвы можете сделать:

find . -maxdepth 1 -type d | xargs ls -ld

Если вы действительно хотите использовать цикл, вы можете использовать следующую конструкцию:

for file in $(ls)
do
  if [[ -d $file ]]
  then
    ls -ld $file
  fi
done

Цикл forперебирает все записи, возвращаемые функцией ls, а затем ifпроверяет, является ли запись каталогом.

решение4

список имен каталогов

compgen -d

Не начиная с точки

compgen -d -X '.*' | xargs ls -dlrt

Связанный контент