La solución más fácil sería hacer la copia más tarde:
#!/bin/bash
# something something script stuff
[ ! -f somefile ] && exit 1
find something -type f -newer somefile -exec cp {}. ';'
Si desea que el usuario confirme cada copia, use -ok
en lugar de -exec
enfind
:
find something -type f -newer somefile -ok cp {}. ';'
Primero recorrer el archivo para crear una lista de archivos para copiar, pidiéndole al usuario una entrada para cada archivo, y luego realizar la copia:
copy_these=$(mktemp)
find something -type newer somefile \
-exec bash -c '
read -p "Copy $0? [y/n/q]: "
case "$REPLY" in
[yY]*) printf "%s\n" "$0" ;;
[qQ]*) exit 1 ;;
esac' {} ';' >"$copy_these"
# do other stuff
# then copy the files
xargs cp -t. <"$copy_these"
rm -f "$copy_these"
Tenga en cuenta que esto supone que todos los nombres de archivo se comportan bien (sin saltos de línea ), y que se utiliza GNU cp
.
Учитывая, что ваша оболочка предоставила «замену процесса» (любит последние bash
es ), попробуйте
diff <(tr '-' ' ' <file1) <(tr '-' ' '<file2)
1,2c1,2
< 21 0.0081318 0.0000000 0.0000000 0.0000000 0.0138079
< 22 0.0000000 0.0000000 0.0000000 0.1156119 0.0000000
---
> 21 0.0081318 0.0000000 0.0000000 0.0000000 0.0032533
> 22 0.0000000 0.0000000 0.0000000 0.0250637 0.0000000
$ xdiff(){ diff -bu <($1 "$2") <($1 "$3"); }
$ xdiff 'sed s/-\([.0-9]\)/\1/g' file1 file2
вы можете выполнить другую нормализацию данных. например, рассматривать все 0.01
, .01
, -.0100
, -.01e
как одно и то же:
$ norm(){ awk '{for(i=1;i<=NF;i++){$i=$i<0?-$i:+$i};print}' "$@"; }
$ xdiff norm file1 file2
Чтобы напечатать строки из файла2, соответствующие абсолютные значения которых отличаются от соответствующих полей той же строки в файле1, сохраните строки из файла1 в памяти, сравните их абсолютные значения:
function abs(x) {
return x < 0 ? -x : x;
}
# file 1
NR == FNR {
file1[$1]=$2" "$3" "$4" "$5" "$6
}
# file 2
NR != FNR {
split(file1[$1], file1fields);
if ( abs($2) - abs(file1fields[1]) ||
abs($3) - abs(file1fields[2]) ||
abs($4) - abs(file1fields[3]) ||
abs($5) - abs(file1fields[4]) ||
abs($6) - abs(file1fields[5]) )
print;
}
Сохраните это в файл, затем запуститеawk -f /path/to/that/file file1 file2