Кожен каталог у системі Unix (і, мабуть, і будь-яка інша система) містить щонайменше дві записи каталогів. Це .
(поточний каталог) та ..
(батьківський каталог). Що стосується кореневого каталогу, вони вказують на те саме місце, але в будь-якому іншому каталозі вони відрізняються. Ви можете побачити це для себе , використовуючи stat
, pwd
і cd
команди (на Linux):
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
Зверніть увагу , що bin
і sbin
кожен з них має два посилання на нього. Один - це запис каталогу в кореневому каталозі, а другий - .
запис всередині цього каталогу.
Використання " ls
pipe" до wc -l
- простий трюк для підрахунку кількості рядків у висновку ls. Припущення полягає в тому, що кожен файл або каталог буде займати рівно один рядок у висновку. GNU ls, коли вихід є нетермінальним, зробить це автоматично; іншим може знадобитися -1
опція, щоб чітко ввімкнути поведінку. wc -l
просто підраховує та виводить кількість рядків ( -l
) у своєму введенні.
Проблема такого підходу полягає в тому, що в Linux та файлових системах, які традиційно використовуються в Linux, імена файлів та каталогів (вони в цьому плані дійсно є одними і тими ж) можуть містити символи нового рядка . За наявності цих методів розпадається будь-який метод - ці записи будуть рахуватися як два або більше записів, якщо насправді вони є одним.
Поки ви використовуєте GNU ls, не має записів каталогів з іменами, що містять символи нового рядка, і не мають непарних псевдонімів ls
(наприклад, ls -a
), обидва будуть виводити кількість файлів і каталогів у поточному (або вказаному) каталозі. Для більшості людей це досить добре, але в загальному випадку це не вірно .
Якщо вам потрібно правильно обробляти незвичні символи (в першу чергу нові рядки) в іменах запису каталогу, я пропоную скористатися -b
параметром ls, щоб уникнути їх. ls -1bA
буде надрукувати кожну назву вхідного каталогу у власному рядку, уникаючи незвичних символів (тому кожен запис у каталозі буде розглянуто як один), включаючи будь-які точкові файли та -директорії. Увійдіть wc -l
у повний командний рядок, ls -1bA | wc -l
який повідомить про кількість файлів і каталогів у поточному каталозі (але ігноруйте .
і ..
; це різниця між -a
і -A
), але не спускається в жодні підкаталоги. Якщо ви не хочете, щоб якісь точкові файли зараховувались до загальної суми, просто опустіть -A
параметр до ls
.