1

我的团队使用 CVS 进行版本控制。我需要开发一个 shell 脚本,它从文件中提取内容并对所有 .txt 文件(以及当前目录的子目录中存在的文本文件)进行 CVS 标记内容。从中提取内容的文件,脚本,两者都存在于同一目录中。

我尝试运行脚本:

#!bin/bash
return_content(){
  content=$(cat file1)
  echo $content
}
find . -name "*.txt" -type f -print0|grep - v CVS|xargs -0 cvs tag $content

file1=> 从中提取内容的文件 "abc"=> file1 中的内容

输出:

abc
find: paths must precede expression
Usage: find [path...] [expression]
cvs tag: in directory
cvs [tag aborted]: there is no version here; run 'cvs checkout' first

我无法弄清楚问题所在。请帮忙

4

1 回答 1

2

脚本存在一些问题。

1) shebang 行缺少根 /。你有#!bin/bash而且应该是#!/bin/bash

2)-vgrep 的选项在 - 和 v 之间有一个空格(它不应该)

3) 你实际上并没有在最后一行调用 return_content 函数——你引用了函数内部的一个变量。也许最后一行应该如下所示:

find . -name "*.txt" -type f -print0|grep -v CVS|\
    xargs -0 cvs tag $( return_content )

4) 即使在修复了所有这些之后,您可能会发现 grep 会抱怨,因为 print0 正在向其传递二进制数据(由于 -print0 存在嵌入的空值),并且 grep 正在等待文本。您可以在 find 命令中使用更多参数来执行 grep 命令的功能并将 grep 删除,如下所示:

find . -type d -name CVS -prune -o -type f -name "*.txt" -print0 |\
    xargs -0 cvs tag $( return_content )

find 将遍历当前目录(及以下)中的所有条目,丢弃任何名为 CVS 或以下的目录,其余的它将仅选择名为 *.txt 的文件。

我测试了该行的版本:

find . -type d -name CVS -prune -o -type f -name "*.txt" -print0 |\
 xargs -t -0 echo ls -la

我在目录中创建了几个名称中带有空格和 .txt 扩展名的文件,因此脚本将显示结果:

bjb@spidy:~/junk/find$ find . -type d -name CVS -prune -o \
-type f -name "*.txt" -print0 | xargs -t -0 ls -la 
ls -la ./one two.txt ./three four.txt 
-rw-r--r-- 1 bjb bjb 0 Jun 27 00:44 ./one two.txt
-rw-r--r-- 1 bjb bjb 0 Jun 27 00:45 ./three four.txt
bjb@spidy:~/junk/find$ 

-t 参数使 xargs 显示它即将运行的命令。我使用ls -la而不是cvs tag- 它应该对 cvs 工作类似。

于 2013-06-27T04:50:25.343 回答