Следующее решение считает фактическое количество используемого inodes, начинающего с текущего каталога:
find . -print0 | xargs -0 -n 1 ls -id | cut -d' ' -f1 | sort -u | wc -l
Для получения количества файлов того же подмножества используйте:
find . | wc -l
Для решений, исследуя только подкаталоги, не принимая во внимание файлы в текущем каталоге, можно обратиться к другим ответам.
!
символ вызывает замену истории удара. При сопровождении строкой (как в провальном примере), он пытается расшириться до последнего события истории, которое началось с той строки. Точно так же, как $var
расширен до значения той строки, !echo
расширился бы до последней команды эха в Вашей истории.
Пространство является повреждающимся символом в таких расширениях. Сначала отметьте, как это работало бы с переменными:
# var="like"
# echo "$var"
like
# echo "$"
$
# echo "Do you $var frogs?"
Do you like frogs? <- as expected, variable name broken at space
# echo "Do you $varfrogs?"
Do you? <- $varfrogs not defined, replaced with blank
# echo "Do you $ var frogs?"
Do you $ var frogs? <- $ not a valid variable name, ignored
То же самое произойдет для расширения истории. Символ удара (!
) начинается заменяющая последовательность истории, но только если сопровождаемый строкой. Следующий за этим с пространством делают это литеральным ударом вместо части последовательности замены.
Можно избежать этого вида замены и для переменной и для истории expantion при помощи одинарных кавычек. Ваши первые примеры использовали одинарные кавычки и так хорошо работали. Ваши последние примеры находятся в двойных кавычках и таким образом колотят, просканировал их для последовательностей expantion, прежде чем это сделало что-либо еще. Единственная причина первый не смещался, состоит в том, что это пространство является символом прерывания как показано выше.
Как уже сказано Caleb, !
используется для вызова замены истории удара.
Если как я Вы чувствуете, что Вам не нужна такая функция, можно отключить ее вставляющий следующую строку в ~/.bashrc
:
set +H
Мне не нужен он, потому что история может быть восстановлена стрелкой вверх и Ctrl-r возрастающий обратный поиск. См. страницу руководства удара, раздел Commands for Manipulating the History для подробного списка ярлыков.
set +H
в сценарии работает точно также :) +1
– Peter.O
23.08.2011, 15:57
ваш первый пример:
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
может быть сокращено до
echo '! p'
echo '!p'
В одинарных кавычках все символы сохраняют свои буквальные значения. Итак !
потерял свое особое значение, и расширение истории не выполнено.
ваш второй и третий примеры:
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
может быть сокращено до
echo "'! p'"
echo "'!p'"
'! p '
и '! p '
по сути являются частями строк в двойных кавычках.
В двойных кавычках все символы сохраняют свои буквальные значения , кроме $
, `
, \
и !
.
Это подразумевает одинарные кавычки '! p '
и '! p '
утратили свое особое значение (т.е. невозможно сбежать !
), но !
по-прежнему сохраняет свое особое значение, поэтому выполняется расширение истории.
Однако, когда ! За
следует пробел, раскрытие истории не выполняется.
Цитата из man bash
:
ЦИТАТА
[...]
Заключение символов в одинарные кавычки сохраняет буквальное значение каждого символа в кавычках. [...]
Заключение символов в двойные кавычки сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \, и, когда раскрытие истории включено, !. [...] Если этот параметр включен, раскрытие истории будет выполняться, если! заключенные в двойные кавычки экранируются обратной косой чертой. Обратная косая черта перед! не удаляется.
РАСШИРЕНИЕ ИСТОРИИ
[...]
Расширение истории начинается с появления символа расширения истории , который есть! по умолчанию. Только обратная косая черта (\) и одинарные кавычки могут заключать в кавычки символ раскрытия истории.
Некоторые символы запрещают раскрытие истории, если они встречаются сразу после символа раскрытия истории, даже если он не заключен в кавычки: пробел, табуляция, новая строка, возврат каретки и =. Если включена опция оболочки extglob , (также будет запрещать расширение.
var=word; echo "test '$var'"; echo 'test "$var"'
– Caleb 23.08.2011, 16:12