Кожен каталог у системі 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кожен з них має два посилання на нього. Один - це запис каталогу в кореневому каталозі, а другий - .запис всередині цього каталогу.
Використання " lspipe" до 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.