Это закончило тем, что было проблемой с Аналогично Открытым. "ls" был единственной командой, которые пытаются разрешить UID/GID, когда sftp'ing, и при этом, это перешло в аналогично для разрешения, и как только это сделало, это отказало.
/etc/nsswitch.conf установка должна была использовать файлы сначала:
passwd: files lsass
shadow: files
group: files lsass
но по некоторым причинам это все еще перешло в аналогично. Решение состояло в том, чтобы добавить корректную группу к "RequireMembershipOf", который для RHEL6 был в /opt/likewise/bin/lwconfig.txt
Принятие там - только один 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
Что-то как этот, возможно?
#!/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 комментарий
jar xf
путь файла, который Вы хотите извлечь, относительно к корню банки.
– lgeorget
25.04.2013, 19:15
find
например.
– lgeorget
25.04.2013, 19:23
for i in {1..$n}
является неправильным. Синтаксический анализатор Bash выполняет Расширение Фигурной скобки перед любыми другими расширениями или заменами. Таким образом, код расширения фигурной скобки видит литеральный $n, который не является числовым, и поэтому он не разворачивает фигурные скобки в список чисел. Это делает почти невозможным использовать расширение фигурной скобки для создания списков, размер которых только известен во времени выполнения.
– Rany Albeg Wein
25.04.2013, 21:23
Этот сценарий должен сделать то, в чем Вы нуждаетесь. Существует несколько предположений, которые это делает, и это не является чрезмерно модульным. Не имеет никаких проверок также. Нуждался бы в большем количестве специфических особенностей для создания этого более устойчивым.
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
Вот решение для 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
Можно использовать эту функцию для извлечения всех файлов из банок
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)
В зависимости от потребностей могло быть хорошо использовать мерзавца также. Это могло легко быть расширено для включения других файлов и т.д. Сценарий ниже является простым вариантом более сложного, который я записал с этой целью. Добавленный находят функциональность.
Это читает даты из извлеченного файла и использования, что в фиксации – таким образом Вы также получаете хорошее представление времени.
Как образец Вы могли затем разность на версиях:
Или используйте GUI для хорошего показа различий. Путем сохранения дат на фиксации представления также дает хороший обзор:
Расположенный в каталог мерзавца Вы могли затем также легко посмотреть на различные версии, например.
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'
И т. д. и т. п.
#!/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