Найдите файлы более новыми, чем другой файл в каждом подкаталоге

Благодаря подсказкам в ответе warl0ck я записал этот сценарий fakepkg:

#!/bin/bash
set -e

OLDDIR=$PWD

NEWDIR=$(mktemp -dt fakepack.XXX)
cd $NEWDIR

yaourt -G $1
cd $1

#TODO this can probably be retrieved from the pacman desc file
while true; do
  read -p "Edit PKGBUILD? [yn]" -n1 yn
  case $yn in
    [Yy]* ) $EDITOR PKGBUILD; break;;
    [Nn]* ) echo; break;;
    * ) echo ;;
  esac
done

. PKGBUILD
srcdir=$NEWDIR/$1/src
# In case you are wondering: this tries to compensate for packages not using
# a simple src/packagename-pkgver/ structure. It will probably still break...
PKSUB=$(eval "echo $(grep -o '\${\?srcdir.*pkgver}\?' PKGBUILD | head -n1 )")
SRC=${PKSUB##$NEWDIR/$1/}
echo "Putting the $1 source to $SRC"

PKG=$pkgname-$pkgver
# SRC="src/$PKG/"
FILES="/var/lib/pacman/local/$PKG-$pkgrel/files"

if [ ! -f $FILES ]; then
  echo "$FILES not found, is $1 actually installed?"
  exit 1
fi

#TODO use existing sources or skip this entirely
#     but it's the easiest way to later use makepkg -R
echo "Reloading source"
makepkg -o

echo "Collecting $1 files"
mkdir -p $SRC/files/
while IFS= read -r line; do
  if [ -f "/$line" ]; then
    mkdir -p $SRC/files/$(dirname $line)
    rsync -a /$line $SRC/files/$line
  fi
done < $FILES

echo "Creating fake Makefile"
echo 'install:' > $SRC/Makefile
echo '  mv files/* $(DESTDIR)' >> $SRC/Makefile
rm -f $SRC/GNUmakefile

echo "Creating package"
makepkg -R
mv *.xz $OLDDIR
cd $OLDDIR
rm -rf $NEWDIR

Выполненный fakepkg packagename, адаптироваться PKGBUILD при необходимости и надежда на a package---.pak.tar.xz в Вашем текущем каталоге.

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

6
26.01.2014, 01:29
2 ответа
for ms in Class/*/*/MarkSheet*; do
  find "${ms%/*}" -type f -newer "$ms"
done

С Вашим подходом Вы должны к оболочке расшириться MarkSheet* шарик. Так:

find . -mindepth 3 -maxdepth 3 -type d -exec sh -c '
  for dir do
    find "$dir" -type f -newer "$dir"/MarkSheet*
  done' sh {} +
4
27.01.2020, 20:29
  • 1
    Слова благодарности я не мог тренировка, почему это работало в терминале, но не в сценарии. –  ArchNemSyS 25.01.2014, 22:46

Попробуйте это:

find /Class/ -maxdepth 1 -mindepth 1 -type d | while IFS= read -r student; do
    find "$student" -type f -newer "$student/Unit/MarkSheet"*
done

Первое find ищет студенческие каталоги и второе для файлов neer, чем соответствующий MarkSheet.

Можно также сделать это наоборот:

find Class/ -name 'MarkSheet*' | while IFS= read -r mark; do 
  find "$(dirname "$mark")" -newer "$mark" -type f; 
done

Прием здесь должен использовать dirname получить название каталога, содержащего MarkSheet* файл.

1
27.01.2020, 20:29
  • 1
    Извините забыл упоминать, что это должно поддерживать пробелы в –  ArchNemSyS 25.01.2014, 22:32
  • 2
    @ArchNemSyS имен извините, моем плохом, должен был принять это. Обновленный ответ должен работать с пробелами, но Stephane лучше так или иначе. –  terdon♦ 25.01.2014, 22:35

Теги

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