gpt4 book ai didi

linux - 从 shell 脚本中递归地进行 CVS 标记

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:30 26 4
gpt4 key购买 nike

我的团队使用 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

我无法找出问题所在。请帮忙

最佳答案

脚本有一些问题。

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

2) grep 的 -v 选项在 - 和 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 应该类似地工作。

关于linux - 从 shell 脚本中递归地进行 CVS 标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17329637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com