Подсчитать количество строк в каждом файле в текущем каталоге с помощью цикла for?

Вы можете использовать setxkbmap или xmodmap , чтобы поменять местами Caps Lock и Escape. С xmodmap вы можете получить:

! Remove Caps_Lock modifier from real Caps Lock key
clear Lock
! Set real Caps Lock key to present as (left) control
keycode 66 = Control_L
! Set real Escape key to present as Caps Lock
keycode 9 = Caps_Lock
! Make a fake key to hold the Escape keysym, so xcape can use it
keycode 255 = Escape
! Make Caps_Lock and Control_L work as one would expect
add Lock = Caps_Lock
add Control = Control_L

(Строки, начинающиеся с ! , являются комментариями.)

Поместите это в ~ / .xmodmaprc и запустите xmodmap ~ / .xmodmaprc , затем запустите xcape -e '# 66 = Escape' , чтобы добавить функциональность Escape к реальной клавише Caps Lock.

1
10.01.2017, 12:18
3 ответа

Я думаю, вы почти получили его. Вы можете использовать базовое имя «$ 0» до найти имя сценария внутри сценария и распечатать счетчик строк всего, кроме

#!/bin/bash
if [ $# -eq 0 ]
then
    for k in *
    do
        if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
        then
            wc -l "$k"
        fi
    done
else
    for k in $*
    do
         wc -l "$k"
    done
fi

Я взял на себя смелость

  • Использование k вместо l (не рекомендуется для имен переменных, я почти уверен, но не могу найти ссылку (ее можно спутать с 1 , I ))
  • Использование 4 пробелов для отступа вместо 8. В конце концов, это, конечно, ваше решение, но я бы сказал, что 4 более читабельны, чем 8.
  • Цитирование ваших переменных . Настоятельно рекомендуется избегать разделения имен переменных пробелами.
  • Удаление ненужного echo , как указал @Serg.

РЕДАКТИРОВАТЬ Я добавил двойные скобки и тест для каталогов, чтобы игнорировать их, в условное выражение if .

2
27.01.2020, 23:34
#!/bin/bash

if [[ "$#" != 0 ]]; then
  # only process the names given to us
  wc -l "$@"
  exit
fi

# process all regular files in this directory, avoiding this script
for f in ./*; do
    if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
        wc -l "$f"
    fi
done
0
27.01.2020, 23:34

Вместо сценария вы также можете объединить три (3) команды в одну строку и распечатать желаемые результаты.
Например.

find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l

Если вы не хотите выполнять поиск только в текущем каталоге, но также рекурсивно подсчитывать строки, вы можете удалить переключатель «-maxdepth 1» или изменить номер в зависимости от ваших потребностей.

0
27.01.2020, 23:34

Теги

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