下面是一shell程序,仔细阅读这个程序,回答下列问题(提示:“tar rvf …”是以添加方式往文档中写) for i in `find $1 –name *.c -print` do tar rvf back.c $i 2>/dev/null done (1)程序中$i和$1的作用是什么。 (2)程序的执行结果和使用方法(假设这个文件的文件名为myfile)。 (3)程序中的“2>/dev/null”起什么作用?
时间: 2024-03-24 08:39:45 浏览: 64
好的,下面是针对这个Shell程序的回答:
1. $i和$1的作用是什么?
- $i是一个Shell变量,表示当前循环迭代中的文件名。
- $1是一个Shell变量,表示程序在运行时传递的第一个命令行参数,它是一个路径,用于指定要搜索的目录。
2. 程序的执行结果和使用方法(假设这个文件的文件名为myfile):
这个程序会在指定的目录中搜索所有的.c文件,并将它们添加到back.c这个文件中。在执行此程序之前,你需要创建一个名为back.c的文件,以便将.c文件添加到其中。你可以像这样使用这个程序:
```shell
$ bash myfile /path/to/search
```
其中`/path/to/search`是要搜索的目录的路径。
3. 程序中的“2>/dev/null”起什么作用?
这个程序中的“2>/dev/null”是一个I/O重定向,它将标准错误输出(stderr)重定向到空设备文件(/dev/null),以便不会显示任何错误消息。在这种情况下,如果在添加文件时发生错误,则不会显示任何错误消息,而是会忽略它们并继续执行程序。
希望这些回答能够帮助你理解这个Shell程序!
相关问题
for i in `find $1 –name *.c -print` do tar rvf back.c $i 2>/dev/null done
这是一个简单的 Shell 脚本,目的是将指定目录下所有后缀为 .c 的文件打包到 back.c 中。具体解释如下:
- $1 表示脚本执行时第一个参数传入的目录路径。
- find 命令会在该目录下查找所有符合条件的文件,-name 指定查找文件名以 .c 结尾的文件,-print 表示输出查找到的文件路径。
- for 循环遍历 find 命令查找到的所有文件,将文件添加到 back.c 打包文件中。tar 命令的选项 rvf 表示将文件添加到 tar 包中,2>/dev/null 表示将错误输出重定向到 /dev/null,即不输出错误信息。
需要注意的是,如果 back.c 文件不存在,tar 命令会自动创建该文件。如果 back.c 文件已经存在,tar 命令会将新的文件添加到该文件中。如果需要每次打包都生成新的文件,可以使用选项 cvf 替换 rvf。
tar -Avf txt1.tar 1.txt tar: Cannot update compressed archives tar: Error is not recoverable: exiting now
### 解决 `tar` 命令更新压缩归档时 "Cannot update compressed archives" 错误
当尝试使用 `tar` 命令向已有的 `.tar.gz` 或者其他类型的压缩归档文件中添加新文件时,会遇到如下错误提示:
```bash
tar: Cannot update compressed archives
```
这是因为 `tar` 不支持直接更新已经压缩的归档文件[^1]。
为了实现对压缩归档文件的内容修改,可以采用以下方法之一来间接完成目标:
#### 方法一:解压、编辑再打包
1. 将现有的`.tar.gz` 文件先解包至临时目录;
2. 向该临时目录内加入新的文件或移除不需要的项目;
3. 使用不含 `-z`, `-j` 参数(即不启用 gzip/bzip2 压缩选项)的方式创建一个新的未压缩 `.tar` 归档;
4. 对新建好的 `.tar` 进行压缩处理得到最终所需的格式如 `.tar.gz`.
具体操作流程如下所示:
```bash
mkdir temp_dir && cd temp_dir
tar zxvf ../original_file.tar.gz # 解开原始档案到当前工作区
cp /path/to/new_files . # 添加要新增的数据进来
tar cfv updated_archive.tar * # 创建无压缩版本的新存档
gzip updated_archive.tar # 执行压缩动作获得 .tar.gz 结果
mv updated_archive.tar.gz .. # 移动回上层路径覆盖旧版
cd ..
rm -rf temp_dir # 清理不再需要的工作空间
```
这种方法虽然绕了一圈但是能有效达到目的,并且保持了原有结构不变[^3].
#### 方法二:利用管道流即时重定向输出
另一种更高效的做法是借助 shell 的进程间通信机制——命名管道(FIFO),配合 `cat`, `gunzip`, 和 `gzip` 工具链,在不停留于磁盘的情况下动态重组数据流向,从而实现实时更新的效果。这种方式减少了中间环节产生的额外 I/O 开销以及可能存在的风险。
以下是具体的命令组合实例:
```bash
mkfifo pipe_fifo # 创建FIFO特殊设备节点用于传递数据
gunzip -c original_file.tar.gz | \
tar rvf - new_file # 把原内容连同待追加项一起送入标准输入作为新tarball主体
gzip > updated_file.tar.gz # 接收来自前一步骤的标准输出并立即执行压缩写入指定位置
rm pipe_fifo # 完成后删除之前建立的FIFO对象
```
此方案不仅简化了步骤还提高了效率,尤其适合频繁变更场景下的应用需求[^4].
阅读全文