首页 文章

使用多个命令查找-exec

提问于
浏览
328

我试图使用find -exec与多个命令没有任何成功 . 有人知道以下命令是否可行?

find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;

基本上,我试图在当前目录中打印每个txt文件的最后一行,并在行的末尾打印,后跟文件名的逗号 .

10 回答

  • 1

    有一种更简单的方法:

    find ... | while read -r file; do
        echo "look at my $file, my $file is amazing";
    done
    

    或者:

    while read -r file; do
        echo "look at my $file, my $file is amazing";
    done <<< "$(find ...)"
    
  • 4

    丹尼斯的第一个答案是解决问题的答案 . 但事实上它只不过是只有一个exec中的几个命令的发现,就像 Headers 所暗示的那样 . 要用一些命令回答一个exec,我们将不得不寻找其他东西来解析 . 这是一个例子:

    使用1个exec命令使用多个{}引用保留最近10000行.log文件,这些文件在过去7天内已被修改

    1)查看命令将对哪些文件执行的操作:

    find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "echo tail -10000 {} \> fictmp; echo cat fictmp \> {} " \;
    

    2)做到:(注意不再“>”但只有“>”这是想要的)

    find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;

  • 490

    应该使用xargs :)

    find *.txt -type f -exec tail -1 {} \; | xargs -ICONSTANT echo $(pwd),CONSTANT
    

    另一个(在osx上工作)

    find *.txt -type f -exec echo ,$(PWD) {} + -exec tail -1 {} + | tr ' ' '/'
    
  • 7

    使用findx,您可以使用:

    findx /path/to/find -exec 'cmd1, cmd2, cmd3;' -exec 'cmd4, cmd5;'
    
  • 7

    find 接受命令的多个 -exec 部分 . 例如:

    find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
    

    请注意,在这种情况下,第二个命令仅在第一个命令成功返回时运行,如@Caleb所述 . 如果您希望两个命令都运行而不管它们的成功或失败,您可以使用此构造:

    find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
    
  • 45

    以下之一:

    find *.txt -exec awk 'END {print $0 "," FILENAME}' {} \;
    
    find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \;
    
    find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;
    
  • 68

    感谢Camilo Martin,我能够回答相关问题:

    我想做的是

    find ... -exec zcat {} | wc -l \;
    

    这没用 . 然而,

    find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
    

    确实有用,谢谢!

  • 7
    find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;
    
  • 2

    另一种方式是这样的:

    multiple_cmd() { 
        tail -n1 $1; 
        ls $1 
    }; 
    export -f multiple_cmd; 
    find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
    

    在一行

    multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
    
    • multiple_cmd() ” - 是一个功能

    • export -f multiple_cmd ” - 将导出它,以便任何其他子shell可以看到它

    • find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; ” - 找到将在您的示例中执行该函数

    通过这种方式,multiple_cmd可以根据需要同样长且复杂 .

    希望这可以帮助 .

  • -1

    我不知道你是否可以使用find来做到这一点,但另一种解决方案是创建一个shell脚本并使用find运行它 .

    lastline.sh:

    echo $(tail -1 $1),$1
    

    使脚本可执行

    chmod +x lastline.sh
    

    使用 find

    find . -name "*.txt" -exec ./lastline.sh {} \;
    

相关问题