【问题标题】:Linux Commandline Combining filesLinux命令行组合文件
【发布时间】:2012-08-31 05:35:27
【问题描述】:

对于这样的命令,

ls -rt | tail -n 100 

会给出最新修改的100个文件。应该使用什么命令行工具将此查询的结果通过管道传输到,以便将所有显示的文件名复制到一个文件中。例如:

如果一个文件夹有 100 个文件,上面的命令会给我所有的文件名。我想将所有文件中的所有数据复制到第 101 个文件中。我该怎么做?

cat 到目标的每个文件的命令行是我正在寻找的。但我不知道从哪里开始。

【问题讨论】:

    标签: linux command-line cat ls


    【解决方案1】:

    ls -rt | tail -n 100 | xargs cat > file

    1. xargs 命令反复从其标准输入流中读取文本,使用该文本构造命令行,然后执行命令行。

    2. xags cat 表示它将输入文本的每一行视为一个单独的参数,并使用每个输入行作为cat 命令的参数构造一个cat 命令。它将构建尽可能长的命令行,因此它将分叉最少数量的cat 进程。

    3. cat 进程因此会读取您感兴趣的文件,并将其内容按顺序写入标准输出流。

    4. > file 将该文本放入结果文件中

    【讨论】:

      【解决方案2】:

      我发现这很简单:

      cat `ls -rt | tail -n 100` > singleFile
      

      【讨论】:

      • 文件名中带有空格等的中断。
      【解决方案3】:

      如果您的文件名中包含空格,我建议您使用 GNU find:

      find . -maxdepth 1 -type f -printf '%Ts %p\n' \
      | sort -nr       \
      | head -n100     \
      | cut -d' ' -f2- \
      | tr '\n' '\0'   \
      | xargs -0 cat > outfile
      

      findprintf 参数在路径名前面插入最后修改时间(以秒为单位),sort 按降序排列,head 取前 100 个文件,cut 删除修改时间戳, tr 零分隔文件列表,xargs 将文件名正确传递给 cat

      注意,如果文件名中包含换行符,这将不起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-28
        • 2013-12-26
        • 1970-01-01
        • 2012-10-16
        • 2015-03-31
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多