4

作为 linux 的新手,我有以下问题。我有文件列表(这次是由 svn 状态产生的),我想创建一个脚本来循环它们并用 4 个空格替换制表符。

所以我想从

....
D      HTML/templates/t_bla.tpl
M      HTML/templates/t_list_markt.tpl
M      HTML/templates/t_vip.tpl
M      HTML/templates/upsell.tpl
M      HTML/templates/t_warranty.tpl
M      HTML/templates/top.tpl
A  +   HTML/templates/t_r1.tpl
....

类似于

for i in <files>; expand -t4;do cp $i /tmp/x;expand -t4 /tmp/x > $i;done;

但我不知道该怎么做...

4

5 回答 5

16

你可以使用这个命令:

svn st | cut -c8- | xargs ls

这将删除前 8 个字符,只留下文件名列表,没有 Subversion 标志。您还可以添加grepbeforecut以仅过滤某些类型的更改,例如/^M/. xargs将文件列表作为参数传递给给定命令(ls在这种情况下)。

于 2008-11-14T09:46:39.483 回答
3

我会使用 sed,如下所示:

for i in files
do
    sed -i 's/\t/    /' "$i"
done

里面的那个大块有四个空间。;-)

我还没有测试过,但它应该可以工作。我会备份你的文件以防万一。-i 标志意味着它将就地对文件进行替换,但如果它搞砸了,您将希望能够恢复它们。

这假定 $files 包含文件名。但是,您也可以使用 Adam 的方法来获取文件名,只需使用上面不带“$i”的 sed 命令。

于 2008-11-14T09:45:56.223 回答
3

不要求任何投票,但为了记录,我将发布@Adam Byrtek@Dan Fego的综合答案:

svn st | cut -c8- | xargs sed -i 's/\t/    /'
于 2008-11-14T10:44:16.140 回答
2

我无法使用真正的颠覆输出对其进行测试,但这应该可以完成工作:

svn st | cut -c8- | while read file; do expand -t4 $file > "$file-temp"; mv "$file-temp" "$file"; done

svn st | cut -c8-将生成一个没有颠覆标志的文件列表。read然后将每个条目保存在变量中$file,并expand用于在每个文件中用四个空格替换制表符。

于 2008-11-14T10:14:45.887 回答
0

不是您要问的,但也许您应该研究颠覆中的提交钩子?

您可以创建一个挂钩来阻止签入任何在行首包含制表符的代码,或者根本不包含制表符。

在你的颠覆服务器上的 repo 目录中,会有一个名为 hooks 的目录。在其中放置一些名为“pre-commit”的可执行文件,它将在允许提交任何内容之前运行。如果您愿意,它可以返回阻止提交的状态。

这是我必须停止检查语法错误的 php 文件:

#!/bin/bash
REPOS="$1"
TXN="$2"
PHP="/usr/bin/php"

SVNLOOK=/usr/bin/svnlook

$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" > /dev/null

if [ $? -ne 0 ]
then
  echo 1>&2
  echo "You must enter a comment" 1>&2
  exit 1
fi


CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '{print $2}'`

for LINE in $CHANGED
  do
  FILE=`echo $LINE | egrep \\.php$`
  if [ $? == 0 ]
    then
    MESSAGE=`$SVNLOOK cat -t "$TXN" "$REPOS" "${FILE}" | $PHP -l`
    if [ $? -ne 0 ]
      then
      echo 1>&2
      echo "***********************************" 1>&2
      echo "PHP error in: ${FILE}:" 1>&2
      echo "$MESSAGE" | sed "s| -| $FILE|g" 1>&2
      echo "***********************************" 1>&2
      exit 1
    fi
  fi
done
于 2008-11-14T11:58:24.850 回答