【问题标题】:cat-ing files of certain extensions in subdirectoriescat-ing 子目录中某些扩展名的文件
【发布时间】:2015-03-13 08:09:28
【问题描述】:

我有一个目录 parallel/,其中包含以 *.en 扩展名结尾的文件的子目录。

这样做会得到我需要的文件列表。

find parallel/ -name "*.en" -type f

现在我需要cat所有这些文件来获得一个组合文件,即

cat *.en > all.en

我尝试了以下方法,但没有成功:

$ for i in (find parallel/ -name "*.en" -type f): do cat $i ; done
-bash: syntax error near unexpected token `('

$ for i in ((find parallel/ -name "*.en" -type f)): do cat $i ; done
-bash: syntax error near unexpected token `('

有没有办法让我遍历所有子目录并将它们全部“分类”到一个文件中?

【问题讨论】:

    标签: bash loops cat


    【解决方案1】:

    您可以使用-exec 选项在find 本身中调用cat

    find parallel/ -name "*.en" -type f -exec cat {} +
    

    要将其重定向到文件,请使用:

    find parallel/ -name "*.en" -type f -exec cat {} + > all.en
    

    根据man find

    -exec utility [argument ...] {} +
           Same as -exec, except that ``{}'' is replaced with as many pathnames as possible 
           for each invocation of utility. This behaviour is similar to that of xargs(1).
    

    【讨论】:

    • {} + 是什么意思?
    • {}find 命令找到的每个文件的占位符,+ 是命令终止符
    • 使用+ 的优点是效率更高,因为分叉的进程被组合成一个进程(如果可能的话)。
    • 另外,如果您想正确循环查看来自find 输出的文件,那么check this answer
    【解决方案2】:

    你们很亲近;只是缺少美元符号。

    让 bash 评估命令并获得输出;使用$():

    for i in $(find parallel/ -name "*.en" -type f); do cat $i ; done
    

    $() 相当于,但比旧的 backtics 更好更安全

    var=`cmd` #do not use!
    

    【讨论】:

    • 我应该做do cat $i>>all.en吗?
    • 它给了-bash: syntax error near unexpected token done'`
    • 还有一个小错字:在 for() 之后应该有 ; ,而不是 :
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2021-07-22
    相关资源
    最近更新 更多