Результат «ls | wc -l »не соответствует реальному количеству файлов [дубликат]

Вот один способ:

awk -vhead="$(tr '\n' ' ' <file2)" 'BEGIN{print head}{print}' file1 > newfile

Команда tr заменяет символы новой строки пробелами, преобразовывая «столбец» в file2 в «строку». Он передается в awk как переменная head , которая печатается раньше всего. Затем каждая строка входного файла просто печатается.

В качестве альтернативы вы можете сделать все это в awk :

awk 'NR==FNR{printf "%s ",$0; next}FNR==1{print ""}1;' file2 file1 > newfile

NR - номер текущей строки ввода, а FNR - номер строки текущего файла. Эти два будут равны только при чтении 1-го файла. printf "% s", $ 0; next напечатает текущую строку без \ n в конце и перейдет к следующей. FNR == 1 {print ""} предназначен только для добавления \ n после того, как заголовок был напечатан, а 1; - это awk сокращение для «распечатать эту строку».

3
05.09.2016, 21:36
5 ответов

Просто дополнительная информация к вышесказанному,

Вам следует использовать find вместо ls, если вы хотите обработать вывод, он имеет некоторые фьючерсы, которые больше подходят (например, -print0) для передачи результатов другим приложениям.

В приведенном выше случае вы можете использовать его следующим образом,

find . -type f | wc -l

который выведет список всех файлов в текущем каталоге.

11
27.01.2020, 21:07
bash-4.1$ ls
1. total 44
2. -rw-r--r-- 1 comp 11595 Sep  4 22:51 30.xls.txt
3. -rw-r--r-- 1 comp 14492 Sep  4 22:51 A.pdf.txt
4. -rw-r--r-- 1 comp  8160 Sep  4 22:51 comparison.docx.txt
5. -rw-r--r-- 1 comp   903 Sep  4 22:51 Survey.pdf.txt
6. -rw-r--r-- 1 comp  1206 Sep  4 22:51 Steam Table.xls.txt

Верно, в выводе 6 строк. Вы можете использовать: ls -1 , который соответствует формату одного столбца и выглядит так:

ls -1
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
Videos

Теперь wc -l возвращает правильное количество файлов:

ls -1 | wc -l
8
0
27.01.2020, 21:07

Как уже упоминалось другими, делает ls | wc -l не всегда является надежным способом подсчета количества файлов в каталоге.

Вот несколько надежных способов:

  • Вы можете заставить find напечатать . для каждого найденного файла и наберите wc -l , чтобы подсчитать количество строк:

      find. -тип f -printf '. \ n' | wc -l 
     
  • Если в каталоге не так много файлов, вы можете сохранить имена файлов в массиве, а затем получить длину массива:

      для f in *; сделать [-f "$ f"] && files + = ("$ f"); done && echo "$ {# files [@]}" 
     

    Для всех файлов и каталогов это становится проще:

      files = (*) && echo "$ {# files [@]} "
     

Пример:

$ touch $'foo\nbar' 'foo bar' spam                         

$ ls | wc -l                      
4

$ find . -type f | wc -l                                   
4

$ find . -type f -printf '.\n' | wc -l
3

$ for f in *; do [ -f "$f" ] && files+=("$f"); done

$ echo "${#files[@]}"
3
1
27.01.2020, 21:07

Это не работает, потому что wc -l возвращает количество строк вывода команды ls , что в данном случае включает всего 44 . Поскольку ваша оболочка имеет псевдоним для ls как ls -cml , вы получаете дополнительную информацию, которая портит ваш вывод.

Вместо этого используйте команду «ls» -Aq | wc -l . Команда -A выводит список всех файлов в каталоге, включая файлы точек, но исключает . и .. . Цитаты здесь важны - они игнорируют псевдоним и запускают напрямую / bin / ls .

-q гарантирует, что все имена файлов печатаются только в одной строке, даже если они содержат символы новой строки (которые затем будут отображаться как ? ).

9
27.01.2020, 21:07

wc - это счетчик символов, слов и строк, а не счетчик файлов.

Вы, программист / автор сценария, несете ответственность за то, чтобы подсчитывать то, что вы хотите, и соответственно корректировать расчет.

В вашем случае вы можете сделать что-то вроде:

echo $((`ls|wc -l`-1))

Наконец, обратите внимание, что ваш ls , вероятно, является псевдонимом, поскольку он дает длинный список, который не является обычным ls без аргументы. Поэтому может быть хорошей идеей обратиться к полному пути ls (обычно / bin / ls ), чтобы избежать путаницы.

8
27.01.2020, 21:07

Теги

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