Перенаправьте каждую партию xargs через wc -l

То, что у вас есть, это вывод от git diff (не обычная команда diff). Вы не будете использовать обычную программу patch для его применения. Вместо этого вы будете использовать инструмент git "apply".

Дополнительная литература:

-1
21.03.2019, 19:23
2 ответа

Если вы используете GNU find, вы можете указать количество ссылок с помощью -printf %n. Таким образом, вы можете получить максимальное значение с:

find. -name 'file*' -printf '%n\n' | sort -rn | head -n1

Однако обратите внимание, что это число может включать ссылки, которых нет в ., или записи, не соответствующие шаблону file*.

Если вы хотите подсчитать только жесткие ссылки с именем file*, найденные в ., и просмотреть пути для них, вы можете выполнить:

find. -name 'file*' -printf '%i\0%p\0' | gawk -v RS='\0' '
   {
     inode = $0
     getline file
   }
   ++count[inode] >= max {
     files[inode] = files[inode] " - " file ORS
     max = count[inode]
     max_inode = inode
   }
   END {
     printf "%s", "File with most links ("max"):\n" files[max_inode]
   }'

Который по-прежнему будет запускать только один findвызов вместо одного для каждого файла.

2
28.01.2020, 05:07

Вы можете просто создавать новую оболочку для каждого xargs:

find. -name "file*" | xargs -n 1 sh -c 'echo "$1"; find. -samefile "$1" | wc -l' xargs-sh

Хотя использование xargsздесь — плохая идея, так как это приведет к поломке, если пути к файлам содержат пробелы или символы в кавычках.

Здесь использование wc -lтакже является ненадежным, поскольку оно ломается, если пути к файлам содержат символы новой строки.

Вы можете использовать стандартный синтаксис find -exec cmd {} +и избежать необходимости запускать один shдля каждого файла с помощью цикла:

find. -name "file*" -exec sh -c '
  for file do
    printf "%s\n" "$file"
    find.//. -samefile "$file" | grep -c //
  done' find-sh {} +
2
28.01.2020, 05:07

Теги

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