То, что у вас есть, это вывод от git diff (не обычная команда diff
). Вы не будете использовать обычную программу patch
для его применения. Вместо этого вы будете использовать инструмент git "apply".
Дополнительная литература:
Если вы используете 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
вызов вместо одного для каждого файла.
Вы можете просто создавать новую оболочку для каждого 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 {} +