Linux笔记之删除指定目录下除最新修改的以 .pack 为扩展名的文件之外的所有文件

2023-12-13 16:22:00

code review!

1.Linux笔记之删除指定目录下除最新修改的以 .pack 为扩展名的文件之外的所有文件

这段代码是使用C++语言编写的,它执行了一系列命令来删除指定目录下的旧文件。让我逐行解释代码的功能:

  1. 首先,声明并初始化了一个名为cmdstd::string变量,用于存储要执行的命令。命令的内容是一个字符串,它由多个子命令以管道符(|)连接而成。

    std::string cmd = "ls -t "+ pack_path + "/*.pack | tail -n +2 | xargs rm";
    ```
    
    - `ls -t`:这个子命令是用于列出指定目录下的文件和目录,并按照修改时间的倒序排列。
    - `pack_path`:这是一个变量,用于指定目录的路径。它将被拼接到命令中的`/*.pack`之前,表示要列出以`.pack`为扩展名的文件。
    - `/*.pack`:这个子命令是用于匹配指定目录下以`.pack`为扩展名的文件。
    - `tail -n +2`:这个子命令是用于从输入中提取第2行及其之后的内容。在这里的作用是跳过第一行的文件(即最新修改的文件)。
    - `xargs rm`:这个子命令是用于将前面的输出作为参数传递给`rm`命令,从而删除相应的文件。
    
    
  2. 接下来,使用system函数执行存储在cmd变量中的命令。

    system(cmd.c_str());
    ```
    
    ``cmd.c_str()`将`cmd`变量转换为C风格的字符串,然后`system`函数将该字符串作为参数传递给操作系统来执行对应的命令。
    
    

综上所述,这段代码的作用是列出指定目录下以.pack为扩展名的文件,根据修改时间的倒序排列,然后删除除最新修改的文件之外的所有文件。

2.将指定目录下除最新修改的以 .pack 为扩展名的文件之外的所有文件移动到另一个目录

这段代码是使用C++语言编写的,它执行了一系列命令来移动指定目录下的旧文件到另一个目录。让我逐行解释代码的功能:

  1. 首先,声明并初始化了一个名为cmdstd::string变量,用于存储要执行的命令。命令的内容是一个字符串,它由多个子命令以管道符(|)连接而成。

    std::string cmd = "ls -t "+ pack_path + "/*.pack | tail -n +2 | xargs -I{} mv {} " + new_pack_path;
    ```
    
    - `ls -t`:这个子命令是用于列出指定目录下的文件和目录,并按照修改时间的倒序排列。
    - `pack_path`:这是一个变量,用于指定目录的路径。它将被拼接到命令中的`/*.pack`之前,表示要列出以 `.pack` 为扩展名的文件。
    - `/*.pack`:这个子命令是用于匹配指定目录下以 `.pack` 为扩展名的文件。
    - `tail -n +2`:这个子命令是用于从输入中提取第2行及其之后的内容。在这里的作用是跳过第一行的文件(即最新修改的文件)。
    - `xargs -I{}`:这个子命令是用于将前面的输出作为参数传递给`mv`命令,并使用`{}`作为占位符,将每个文件名依次替换到`{}`的位置。
    - `mv {}`:这个子命令是用于移动文件,`{}`将被实际的文件名替换。
    - `new_pack_path`:这是一个变量,用于指定目标目录的路径。它将被拼接到命令的末尾,表示要将文件移动到这个目录。
    
    
  2. 接下来,使用system函数执行存储在cmd变量中的命令。

    system(cmd.c_str());
    ```
    
    ``cmd.c_str()`将`cmd`变量转换为C风格的字符串,然后`system`函数将该字符串作为参数传递给操作系统来执行对应的命令。
    
    

综上所述,这段代码的作用是列出指定目录下以.pack为扩展名的文件,根据修改时间的倒序排列,然后将除最新修改的文件之外的所有文件移动到另一个目录。

3.xargs:用于从标准输入中读取数据,并将其作为参数传递给指定的命令

xargs是一个命令行工具,用于从标准输入中读取数据,并将其作为参数传递给指定的命令。它可以将输入数据分割为单个参数,并将这些参数传递给命令进行处理。让我们详细解释xargs的用法和功能。

基本语法:

xargs [选项] [命令]

常用选项:

  • -I{替换字符串}:指定一个占位符,用于替换输入中的每个参数。通常使用{}作为占位符,可以在命令中多次出现以表示不同的参数位置。
  • -n 数字:指定每次执行命令时传递的参数个数。默认情况下,xargs将尽可能多地传递参数,但可以使用-n选项限制每次传递的参数个数。
  • -t:显示要执行的命令,但不实际执行。
  • -p:在执行每个命令之前提示用户确认。

使用示例:

  1. 基本用法:将输入作为命令参数传递。

    echo "file1 file2 file3" | xargs rm
    ```
    上述命令将字符串`file1 file2 file3`通过管道传递给`xargs`,然后`xargs`将其作为参数传递给`rm`命令,相当于执行了`rm file1 file2 file3`。
    
    
  2. 通过-I选项替换占位符:

    echo "file1 file2 file3" | xargs -I{} mv {} dest/
    ```
    上述命令将字符串`file1 file2 file3`通过管道传递给`xargs`,然后`xargs`使用`-I{}`选项将每个参数替换为`{}`占位符,并将其作为参数传递给`mv`命令,相当于执行了`mv file1 dest/`、`mv file2 dest/`和`mv file3 dest/`。
    
    
  3. 限制每次传递的参数个数:

    echo "file1 file2 file3 file4 file5" | xargs -n 2 rm
    ```
    上述命令将字符串`file1 file2 file3 file4 file5`通过管道传递给`xargs`,然后`xargs`使用`-n 2`选项,每次将两个参数传递给`rm`命令,相当于执行了`rm file1 file2`和`rm file3 file4`,最后一个参数`file5`单独执行了一次`rm`命令。
    
    
  4. 从文件中读取参数:

    cat filelist.txt | xargs rm
    ```
    上述命令将文件`filelist.txt`的内容通过管道传递给`xargs`,然后`xargs`将每一行作为参数传递给`rm`命令,实现批量删除文件的功能。
    
    

这些只是xargs命令的一些常见用法,它还有其他选项和功能可以根据需要进行调整和使用。请注意,当使用xargs时,请确保输入的参数不包含特殊字符或空格,以避免意外行为。

4.xargs和awk区别

xargsawk是两个不同的命令行工具,它们在处理输入数据和执行操作时有一些区别。

  1. 功能:

    • xargs:主要用于从标准输入中读取数据,并将其作为参数传递给指定的命令。它可以将输入数据分割为单个参数,并将这些参数传递给命令进行处理。xargs通常用于处理文件列表、批量执行命令等场景。
    • awk:是一种强大的文本处理工具,用于从输入文本中提取和处理数据。它基于行进行操作,并可以根据指定的规则和模式进行数据匹配、转换和输出。awk通常用于处理结构化文本数据、数据分析和报告生成等任务。
  2. 数据处理:

    • xargs:将输入数据作为参数传递给命令,每个参数通常是以空格或换行符分隔的文本。xargs可以根据需要对输入进行分割和重组,然后将其传递给命令进行处理。
    • awk:以行为单位处理输入数据,可以根据指定的字段分隔符对每一行进行分割,并对每个字段进行操作。awk提供了丰富的内置函数和操作符,可以进行数据过滤、转换、计算和格式化等操作。
  3. 使用场景:

    • xargs:适用于需要将输入数据作为参数传递给命令进行处理的场景,如批量执行命令、删除文件、移动文件等。
    • awk:适用于需要对结构化文本数据进行处理和分析的场景,如数据提取、数据转换、数据筛选、报告生成等。

总结而言,xargs主要用于处理命令行参数,将输入数据作为参数传递给命令执行,而awk主要用于处理文本数据,对每一行进行分割和操作。它们在功能和使用场景上有所不同,可以根据具体需求选择合适的工具。

文章来源:https://blog.csdn.net/weixin_43297891/article/details/134906549
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。