ls для рекурсии с указанием полного пути

Вы можете проверить /proc/partitions, чтобы увидеть количество блоков в данном разделе, и использовать lsblkили df, чтобы проверить размер раздела в байтах. Количество байтов, разделенных блоками, даст размер блока в байтах.

Например, на моем рабочем столе:

$ cat /proc/partitions
major minor  #blocks  name

   8        0  312571224 sda
   8        1  308392960 sda1
   8        2          1 sda2
   8        5    4175872 sda5
  11        0      19930 sr0
   8       16  244198584 sdb
km0@mkdisplay:~$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 298.1G  0 disk
├─sda1   8:1    0 294.1G  0 part /
├─sda2   8:2    0     1K  0 part
└─sda5   8:5    0     4G  0 part [SWAP]
sdb      8:16   0 232.9G  0 disk
sr0     11:0    1  19.5M  0 rom
$ python
Python 2.7.13 |Anaconda, Inc.| (default, Sep 22 2017, 00:47:24)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 298.1*1024*1024*1024/312571224.
1024.03040701661
-1
27.04.2021, 19:38
1 ответ

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

.
shopt -s globstar nullglob dotglob

for dirpath in./**/; do
    printf '%s\n' "$dirpath"
    # whatever other code needs to be run on "$dirpath"
done

Я разрешаю globstarполучать доступ к **, а также разрешаю nullglobи dotglobполностью пропускать цикл, если шаблон ничему не соответствует, а также увидеть скрытые файлы.

Шаблон ./**/будет соответствовать любому каталогу в текущем каталоге или ниже него, точно так же, как ./*/будет соответствовать любому каталогу в текущем каталоге.

Используйте ./**/*или ./**, чтобы вывести список всех типов файлов.

Вы также можете сделать это портативно с помощьюfind:

find. -type d -exec sh -c '
    for dirpath do
        printf "%s\n" "$dirpath"
        # whatever other code needs to be run on "$dirpath"
    done' sh {} +

Здесь findпередает в цикл скрипта sh -cпути к каталогам.

Единственная разница, которую вы увидите при запуске этих двух примеров, заключается в том, что в первом примере (цикл bashс**)разрешает символические ссылки на каталоги,в то время как findне разрешает символическую ссылку на каталоги.

Если все, что вам нужно, это перечислить каталоги, то пример findможно значительно сократить до

find. -type d -print

Используйте -type fвместо -type d, чтобы просматривать только обычные файлы, и полностью удалите тест -type, чтобы просматривать все типы файлов.

Очевидно, вы могли бы также использовать lsдля получения такого списка, но я не вижу в этом особого смысла, так как вы все равно ничего не можете сделать, кроме как смотреть на вывод из ls.

shopt -s globstar dotglob

ls -1d./**

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

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

1
28.04.2021, 22:50

Теги

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