
Я отдал команду:
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