Проверьте файл svn и добавьте его метку времени к ее имени

Предположим, у меня есть файл в SVN на

http://example.com/file.txt 

Я хочу проверить его на file-20131218-2000.txt где 18 декабря 2013 года в 8 вечера, когда последняя фиксация этого файла произошла в соответствии с svn log .

Каков хороший способ сделать это в оболочке bash?

 $ uname -a Linux my-computer 3.2.0-4-amd64 #1 SMP Debian 3.2.51-1 x86_64 GNU/Linux 

Моя версия SVN 1.6.17.

  • Команда svn, чтобы увидеть счет моих изменений
  • Настройка нескольких групп в качестве владельцев каталогов
  • Как пакет работает без всех зависимостей, установленных в целевой системе?
  • Ошибки скрипта svn backup bash
  • Журнал Grep и получение текста между разделителями журналов
  • Как выводить файл и игнорировать строки, начинающиеся с «?»?
  • Как «ls» текущий каталог (который находится в svn) информация о файлах (путь)?
  • сценарии оболочки, которые отвечают на вывод консоли
  • 3 Solutions collect form web for “Проверьте файл svn и добавьте его метку времени к ее имени”

    Хорошо, поэтому у меня есть решение, которое немного хакерское. Добавьте следующую функцию в ваш файл ~/.bashrc .

     svnco() { if [ $# -ne 1 ]; then # Fixed space here. echo "Usage: svnco [URL]" return fi DIRECTORY=`dirname "$1"` BASENAME=`basename "$1"` EXTENSION="${BASENAME##*.}" FILENAME="${BASENAME%.*}" DATE=$(date -d "`svn info "$1" | grep "Last Changed Date" | sed 's/Last Changed Date: //'`" +%Y%m%d-%H%M) svn co "$DIRECTORY" . --depth empty svn up "$BASENAME" mv "$BASENAME" "$FILENAME-$DATE.$EXTENSION" } 

    Это даст вам желаемый эффект. После сохранения в вашем .bashrc вам нужно запустить source ~/.bash_profile

    И чтобы вызвать, просто выполните следующие действия: svnco http://svn.apache.org/repos/asf/tomcat/trunk/build.xml

    Справедливое предупреждение, вы можете столкнуться с проблемой в конечном итоге, так как это также создаст каталог .svn . Если хотите, вы можете rm -rf .svn в конец функции. Я не собираюсь, хотя.

    Когда вы выполняете svn export , svn устанавливает время изменения экспортируемого файла на дату пересмотра.

    Итак (синтаксис zsh ):

     zmodload zsh/stat url=http://example.com/file.txt svn export $url tmpfile && zstat -F %Y%m%d-%H%M -A t +mtime tmpfile && mv -- tmpfile $url:t:r.$t.$url:e 

    У этого нет условия гонки, где новая ревизия могла быть проверена между svn info и svn cat .

    Если это должно быть bash , если у вас есть GNU find :

     url=http://example.com/file.txt svn export "$url" tmpfile && t=$(find tmpfile -prune -printf '%TY%Tm%Td-%TH%TM') && b=${URL##*/} && mv -- tmpfile "${b%.*}.$t.${b##*.}" 

    Если вы хотите сделать это для всех файлов там, вы можете export весь каталог:

     svn export http://example.com/ mydir 

    И выполните все переименования сразу:

     find mydir ! -type d -printf '%TY%Tm%Td-%TH%TM/%p\0' | while IFS=/ read -rd '' tf; do b=${f##*/} mv -Tv "$f" "${f%/*}/${b%.*}.$t.${b##*.}" done 

    (при условии find GNU и GNU mv )

    Вы можете использовать svn info для получения информации о файле в удаленном репозитории, это не требует никакой проверки. Вы можете использовать svn cat для извлечения удаленного файла на стандартный вывод, это также не требует никакой проверки.

     date=$(LC_ALL=C svn info "$url" | awk 'sub(/^Last Changed Date: /, "") {gsub(/[-:]/, ""); print $1 "-" $2}') basename=${url##*/} extension=${filename##*.}; basename=${basename%".$extension"} svn cat "$url" >"$basename-$date.$extension" 
    Linux и Unix - лучшая ОС в мире.