我试图使用find -exec与多个命令没有任何成功 . 有人知道以下命令是否可行?
find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;
基本上,我试图在当前目录中打印每个txt文件的最后一行,并在行的末尾打印,后跟文件名的逗号 .
有一种更简单的方法:
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 ...)"
丹尼斯的第一个答案是解决问题的答案 . 但事实上它只不过是只有一个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" \;
应该使用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 ' ' '/'
使用findx,您可以使用:
findx /path/to/find -exec 'cmd1, cmd2, cmd3;' -exec 'cmd4, cmd5;'
find 接受命令的多个 -exec 部分 . 例如:
find
-exec
find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;
请注意,在这种情况下,第二个命令仅在第一个命令成功返回时运行,如@Caleb所述 . 如果您希望两个命令都运行而不管它们的成功或失败,您可以使用此构造:
find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;
以下之一:
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"' _ {} \;
感谢Camilo Martin,我能够回答相关问题:
我想做的是
find ... -exec zcat {} | wc -l \;
这没用 . 然而,
find ... | while read -r file; do echo "$file: `zcat $file | wc -l`"; done
确实有用,谢谢!
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;
另一种方式是这样的:
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() ” - 是一个功能
multiple_cmd()
“ export -f multiple_cmd ” - 将导出它,以便任何其他子shell可以看到它
export -f multiple_cmd
“ find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; ” - 找到将在您的示例中执行该函数
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
通过这种方式,multiple_cmd可以根据需要同样长且复杂 .
希望这可以帮助 .
我不知道你是否可以使用find来做到这一点,但另一种解决方案是创建一个shell脚本并使用find运行它 .
lastline.sh:
echo $(tail -1 $1),$1
使脚本可执行
chmod +x lastline.sh
使用 find :
find . -name "*.txt" -exec ./lastline.sh {} \;
10 回答
有一种更简单的方法:
或者:
丹尼斯的第一个答案是解决问题的答案 . 但事实上它只不过是只有一个exec中的几个命令的发现,就像 Headers 所暗示的那样 . 要用一些命令回答一个exec,我们将不得不寻找其他东西来解析 . 这是一个例子:
使用1个exec命令使用多个{}引用保留最近10000行.log文件,这些文件在过去7天内已被修改
1)查看命令将对哪些文件执行的操作:
2)做到:(注意不再“>”但只有“>”这是想要的)
find / -name "*.log" -a -type f -a -mtime -7 -exec sh -c "tail -10000 {} > fictmp; cat fictmp > {} ; rm fictmp" \;
应该使用xargs :)
另一个(在osx上工作)
使用findx,您可以使用:
find
接受命令的多个-exec
部分 . 例如:请注意,在这种情况下,第二个命令仅在第一个命令成功返回时运行,如@Caleb所述 . 如果您希望两个命令都运行而不管它们的成功或失败,您可以使用此构造:
以下之一:
感谢Camilo Martin,我能够回答相关问题:
我想做的是
这没用 . 然而,
确实有用,谢谢!
另一种方式是这样的:
在一行
“
multiple_cmd()
” - 是一个功能“
export -f multiple_cmd
” - 将导出它,以便任何其他子shell可以看到它“
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
” - 找到将在您的示例中执行该函数通过这种方式,multiple_cmd可以根据需要同样长且复杂 .
希望这可以帮助 .
我不知道你是否可以使用find来做到这一点,但另一种解决方案是创建一个shell脚本并使用find运行它 .
lastline.sh:
使脚本可执行
使用
find
: