Проверьте файл 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.

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 - лучшая ОС в мире.