Выполните команду на всех файлах в дереве каталогов и поместите вывод в переменную

Текущая версия в репозиториях 4.1.0-2.1: Ваши зеркала не актуальны.

Выберите правильно синхронизировавшее зеркало, и pacman -Syy && pacman -Syu

1
11.10.2012, 03:46
5 ответов

Если Вы хотите выполнить команду и добраться, вывод используют строку ниже

d=`git log`

В Вашем сценарии необходимо измениться два две вещи. У меня есть корректный сценарий ниже

#!/bin/bash
rep="*"

for f in `ls -R $rep`; do
d=`git log $f| wc -l`
c=$d
echo $c
done

Править: Исходное исправление изменяет кавычки на обратные галочки, чтобы заставить вывод достигнуть d переменной. Кроме того, $rep должен быть в обратных галочках с ls, иначе он добавит * в конце последнего обработанного имени файла.

2
27.01.2020, 23:21
  • 1
    Да это работает, у меня есть тот же результат, когда я работаю eval команда :). Спасибо –  user15992 10.10.2012, 12:42

Я уже ответил на Вашу другую Синтаксическую ошибку вопроса в сценарии удара, который находят вызовы, таким образом, я не повторю то, что я уже записал в своем ответе там.

Не анализируйте вывод ls. Вы не должны работать ls перечислить файлы в каталоге. Использовать find если необходимо рекурсивно вызвать в подкаталоги.

Получить вывод wc -l, используйте его в замене команды: $(git log "$f" | wc -l)

Обратите внимание необходимость в двойных кавычках вокруг имени переменной. Всегда используйте двойные кавычки вокруг переменной и управляйте заменами: "$foo", "$(foo)". Двойные кавычки выключают последующую обработку оболочки значения переменной или управляют выводом: без кавычек результат разделяется на слова, которые интерпретируются как подстановочные шаблоны файла. С одинарными кавычками, $ знак не рассматривают особенно, таким образом, git видел бы $f вместо значения.

find . -type f -exec sh -c '
  for x in "$@"; do
    c=$(git log "$f" | wc -l)
  done
' _ {} +

Использование -exec … {} + вместо -exec … {} \; позволяет промежуточной оболочке быть вызванной только однажды на большой пакет файлов, который немного быстрее.

Начиная с удара ≥4, Вы не должны использовать find, можно использовать ** синтаксис для рекурсивного вызова в подкаталоги.

shopt -s globstar
for x in **/*; do
  [ -f "$x" ] || continue  # skip directories and other non-regular files
  git log "$x" | wc -l
done
2
27.01.2020, 23:21

Насколько я знаю команду:

     git log

Покажет все истории пересмотра. Если это верно, я предполагаю, что Вы пытаетесь сохранить содержание в файле, названном myfile, и затем Вы хотите не считать никакие из строк в файле.

Если это - то, что Вы хотите, сначала можно сохранить историю таким образом:

     git log>myFile.txt

Теперь Вы не должны находить никакие из строк с помощью туалета-l и хранить его файл под названием nOfLines.txt

Таким образом, необходимо сделать это:

    wc -l<myFile.txt>nOfLines.txt

Затем сохраните содержание этого файла в переменной, названной gitVar.

     gitVar=$(cat nOfLines.txt)

Вы видите, работает ли это правильно с помощью этой команды:

     echo "$gitVar"

Просто свяжите все это в сценарии, названном "myCommand.sh", дайте ему permssions, использующий chmod a+x, и запустите скрипт от терминала как команда.

1
27.01.2020, 23:21
  • 1
    Можно предпочесть wc -l < myFile.txt > nOfLines.txt вместо этого избегать wc упоминание входного имени файла в его выводе. –  manatwork 10.10.2012, 13:02
  • 2
    @manatwork: да, tx для указания на него. –  The Dark Knight 10.10.2012, 13:05
  • 3
    У Вас не может быть пробелов вокруг = в присвоении: gitVar=$(cat nOfLines.txt). –  manatwork 10.10.2012, 13:07
  • 4
    @manatwork: А-а-а, другая грубая ошибка мной. Хорошо отредактированный ответ согласно всем Вашим предложениям.Большое спасибо. –  The Dark Knight 10.10.2012, 13:09

У меня есть решение, я думаю с командой eval :D

0
27.01.2020, 23:21

Я думаю, что Вы хотите сделать:

#!/bin/bash
rep="*"

for f in `ls -R`$rep; do
d='git log "$f"| wc -l'
c=$d
echo $c
done

Заметьте двойные кавычки вместо единственных вокруг команды мерзавца.

Меньшее решение могло состоять в том, чтобы использовать:

echo `git log "$f"| wc -l`
-1
27.01.2020, 23:21
  • 1
    Нет с Вашей командой у меня есть тот же результат как мой сценарий. Кроме того, у Вас есть ошибка в Вашем сценарии :) –  user15992 10.10.2012, 12:31
  • 2
    , я очень сожалею. У меня была дополнительная кавычка. Попробуйте теперь и upvote это, если это работает на Вас. –  Aditya Patawari 10.10.2012, 12:32
  • 3
    я исправил его и у меня есть тот же результат! –  user15992 10.10.2012, 12:34

Теги

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