извлеките файл из файла банки и получите разность

Это закончило тем, что было проблемой с Аналогично Открытым. "ls" был единственной командой, которые пытаются разрешить UID/GID, когда sftp'ing, и при этом, это перешло в аналогично для разрешения, и как только это сделало, это отказало.

/etc/nsswitch.conf установка должна была использовать файлы сначала:

passwd:     files lsass
shadow:     files
group:      files lsass

но по некоторым причинам это все еще перешло в аналогично. Решение состояло в том, чтобы добавить корректную группу к "RequireMembershipOf", который для RHEL6 был в /opt/likewise/bin/lwconfig.txt

2
26.04.2013, 00:40
6 ответов

Принятие там - только один abc.jar в соответствии с каждым каталогом:

basedir=path_to_your_Release_dirs
mkdir /var/tmp/reldiff
cd /var/tmp/reldiff
for x in Release1 Release2 Release3; do
   mkdir $x
   cd $x
   find $basedir/$x -name abc.jar -print0 | xargs -0 unzip -j xyz.xsd
   cd ..
done
diff3 */xyz.xsd
1
27.01.2020, 22:14
  • 1
    , у меня есть много каталогов как xyz abc mno...... pqr –  constantlearner 25.04.2013, 19:19
  • 2
    , Возможно, необходимо обновить вопрос, таким образом, это не похоже на Вас только, имеет 3 каталога. –  Anthon 25.04.2013, 19:22

Что-то как этот, возможно?

#!/bin/sh

number_of_releases = 3    

for i in $(seq 1 $number_of_releases)
do
cd Release$i
jar xf abc.jar xyz.xsd
mv xyz.xsd ../xyz.xsd_$i
cd ..
done

for i in $(seq 1 $(($number_of_releases-1)))
do
diff xyz.xsd_$i xyz.xsd_$(($i+1)) > diff_Release$(($i))_to_Release$(($i + 1))
done

РЕДАКТИРОВАНИЕ видит @rany-albeg-wein комментарий

1
27.01.2020, 22:14
  • 1
    Второй аргумент jar xf путь файла, который Вы хотите извлечь, относительно к корню банки. –  lgeorget 25.04.2013, 19:15
  • 2
    , у меня есть много каталогов как xyz abc mno...... pqr –  constantlearner 25.04.2013, 19:18
  • 3
    , если xyz.xsd в том же месте во всем jarfiles, легко установить правильный путь в сценарии. Если это не Ваш случай, необходимо будет извлечь полностью jarfile и затем искать xyz.xsd с find например. –  lgeorget 25.04.2013, 19:23
  • 4
    for i in {1..$n} является неправильным. Синтаксический анализатор Bash выполняет Расширение Фигурной скобки перед любыми другими расширениями или заменами. Таким образом, код расширения фигурной скобки видит литеральный $n, который не является числовым, и поэтому он не разворачивает фигурные скобки в список чисел. Это делает почти невозможным использовать расширение фигурной скобки для создания списков, размер которых только известен во времени выполнения. –  Rany Albeg Wein 25.04.2013, 21:23
  • 5
    ой да Вы правы. Возможно, seq мог иметь некоторую справку затем. –  lgeorget 25.04.2013, 21:45

Этот сценарий должен сделать то, в чем Вы нуждаетесь. Существует несколько предположений, которые это делает, и это не является чрезмерно модульным. Не имеет никаких проверок также. Нуждался бы в большем количестве специфических особенностей для создания этого более устойчивым.

find . -type f -name 'abc.jar' -exec sh -c '
num=$(echo {} | sed 's#.*Release##' | sed 's#/.*##')
jar xvf {} xyz.xsd
mv xyz.xsd xyz.xsd.${num}
' {} \;

for i in xyz.xsd*; do 
  currnum=$(echo $i | sed 's#xyz.xsd.##')
  let nexnum=currnum+1
  [ ! -f xyz.xsd${nexnum} ] || exit
  echo "diff $i xyz.xsd${nexnum} > diffs_xyz.xsd_${currnum}_${nexnum}.txt"
done

Демонстрационные данные

$ tree -A
.
├── myscript.bash
├── Release1
│   ├── abc.jar
│   └── xyz.jar
├── Release2
│   ├── abc.jar
│   └── xyz.jar
├── Release3
│   ├── abc.jar
│   └── xyz.jar
└── Release43
    └── xyz.jar

4 directories, 8 files
0
27.01.2020, 22:14

Вот решение для Perl:

#!/usr/bin/env perl
my $jar="abc.jar";       ## The jar file we will search for
my $target="xyz.xsd";        ## The file we will extract from it
my $data_dir=$ARGV[0]||"./";     ## The directory to search through

## Collect directory names, any directory that contains a file
## called whatever you set as $jar will be saved
my @dirs=split(/\n/,`find \"$data_dir\" -name \"$jar\" -exec dirname {} \\;`);
my @names;
foreach (@dirs) {
    ## Extract the $target from $jar
    system("cd \"$_/\"; jar xf \"$jar\" \"$target\"; cd -");
    ## Save the toplevel directory name
    my @a=split(/\//);
    push @names,$a[1];    
}
## Go through the list and run the diff
for ($i=0; $i<=$#dirs; $i++) {
    for ($k=$i+1; $k<=$#dirs; $k++) {
    system("diff \"$dirs[$i]/$target\" \"$dirs[$k]/$target\" > \"$names[$i]-$names[$k].$target.diff\"");
    }
}

Если Вы сохраняете сценарий Perl как foo.pl и затем выполненный в в каталоге, который содержит различное Release подкаталоги, это создаст эти файлы:

Release1-Release2.xyz.diff
Release1-Release3.xyz.diff
Release3-Release2.xyz.diff

Для запущения скрипта любой делает это исполняемым файлом (chmod a+x foo) и выполненный это непосредственно (./foo.pl) или передайте его жемчугу (perl foo.pl). Каталог, который содержит Release подкаталоги могут быть даны как 1-й аргумент (если ни один не дан, текущий каталог принят):

perl foo.pl /path/to/releases
0
27.01.2020, 22:14
  • 1
    у меня есть много каталогов как xyz abc mno...... pqr –  constantlearner 25.04.2013, 19:17
  • 2
    да, банка прокладывается под землей в aa/bb/abc.jar –  constantlearner 25.04.2013, 22:51
  • 3
    @constantlearner это должно теперь работать с вложенными файлами банки (и с именами каталогов, которые содержат пробелы, на всякий случай). –  terdon♦ 25.04.2013, 23:08
  • 4
    благодарит terdon, почему Вы присваивающий $target = "arachnophilia"; –  constantlearner 25.04.2013, 23:10
  • 5
    @constantlearner, потому что, именно это я использовал для тестирования на моей машине, извините, починенной теперь. –  terdon♦ 25.04.2013, 23:13

Можно использовать эту функцию для извлечения всех файлов из банок

find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1" "$2"' _ {} /path/to/file/inside/jar \;

Как видете, jar может занять секунду (и на) аргумент после xf который будет названием файла, Вы хотите извлечь из файла банки. Этот путь должен быть полным в Вашей древовидной структуре банки. Если Вы не знаете путь к файлу в файле банки, можно использовать эту команду, которая извлечет целый файл банки вместо этого:

find /path/to/dir1 /path/to/dir2 -type f -name 'abc.jar' -exec bash -c 'jar xf "$1"' _ {} \;

При использовании первого метода затем, можно просто выполнить итерации по xsd файлам как это:

for i in *.xsd; do
    # diff your files here
done

При использовании второго, необходимо будет использовать что-то вроде этого:

while IFS= read -rd $'\0' xsd; do
    # diff your files here
done < <(find /path/to/relevant/location -type f -name '*.xsd' -print0)
0
27.01.2020, 22:14

Подход Мерзавца

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

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


Демонстрационное использование

Как образец Вы могли затем разность на версиях:

git diff

Или используйте GUI для хорошего показа различий. Путем сохранения дат на фиксации представления также дает хороший обзор:

gitk --all &

Расположенный в каталог мерзавца Вы могли затем также легко посмотреть на различные версии, например.

 gvim abc.xsd
 git checkout 10.1.2.2.0
 # Look at this version
 # Go back
 git checkout master
 # View pretty log
 git log --date-order --graph --tags --simplify-by-decoration --pretty=format:'%ai %h %d'

И т. д. и т. п.


Быстрая канавка обхода

  1. Создайте целевой каталог и инициализируйте Мерзавца. (Удалите сначала, если существует.)
  2. Папки списка в исходном каталоге и виде их видом версии. (Измените сценарий путем проверки, какой вид дает лучший результат.)
  3. Пойдите канавка каждый каталог порядком и найдите исходный файл.
  4. Файлу копии для предназначения для каталога и извлечения был нужен файл.
  5. Читайте дата модификации из файла добавляют и фиксируют.

Сценарий

#!/bin/bash

#
# Please read script thoroughly before use.
#

# Git directory (created, old deleted!)
git_dir="git_proj"

# Project directory
proj_root="$HOME/tmp/jardiff/sample_proj"
release_dir="GENERIC/RELEASE"
# If file always is in same location:
target_dir="$release_dir/x/y/z"

# Files to (find) copy and extract
jar_file="abc.jar"
xsd_file="abc.xsd"

# If we should use relative absolute target directory or find
use_find=1
# If we want to commit empty (no change, but to list version as separate commit)
commit_empty=0

# Remove existing and create project diff directory
[ -e "$git_dir" ] && (echo y | rm -r "$git_dir")
mkdir -p "$git_dir"

cd "$git_dir"

# Init empty git
git init

# Date is read from file
export GIT_COMMITTER_DATE
export GIT_AUTHOR_DATE
# Author unknown (or extract it from elsewhere)
export GIT_AUTHOR_NAME="Unknown"
export GIT_AUTHOR_EMAIL="john@example.net"
# Committer
export GIT_COMMITTER_NAME="Auto Batch"
export GIT_COMMITTER_EMAIL="batch@mydomain.com"


for dir in $(ls -d "$proj_root"/* | sort -V); do
    echo "Processing: $dir"
    # Use root directory as project version
    bn=$(basename "$dir")
    # Copy target to git directory
    if ((use_find)); then
        if ! fn=$(find "$dir/$release_dir" -name "$jar_file" -print0); then
            fn="" # Probably not needed
        fi
    else
        fn="$dir/$target_dir/$jar_file"
    fi
    if [ -e "$fn" ]; then
        printf "Copying in %s\n" "$fn"
        cp --preserve=timestamps "$fn" .
        # Extract
        jar xf "$jar_file" "$xsd_file"
        # Read modified timestamp
        ts=$(stat -c %y "$xsd_file")
        # Set Git env date variables
        GIT_COMMITTER_DATE="$ts"
        GIT_AUTHOR_DATE="$ts"
        # Add file and commit
        git add "$xsd_file"
    else
        # Use timestamp from root directory
        # Here you would probably use a README file
        # or something else that has a more likely correct date
        # either by a new find or relative path.
        ts=$(stat -c %y "$dir")
        printf "Tagging empty %s - %s\n" "$bn" "$ts"
        # Set Git env date variables
        GIT_COMMITTER_DATE="$ts"
        GIT_AUTHOR_DATE="$ts"
    fi

    if ((commit_empty)); then
        git commit --allow-empty -am "Release $bn"
    else
        git commit -am "Release $bn"
    fi
    # Tag as release
    git tag -a "$bn" -m "Release $bn"
done
0
27.01.2020, 22:14

Теги

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