我试图使用查找-exec与多个命令没有任何成功。有人知道像下面这样的命令是否可行吗?

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

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


当前回答

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

lastline.sh:

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

使脚本可执行

chmod +x lastline.sh

使用找到:

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

其他回答

下面是我的bash脚本,您可以使用它来查找多个文件,然后使用一个命令处理它们。

用法示例。这个命令对每个找到的文件应用一个file linux命令:

./finder.sh file fb2 txt

查找器脚本:

# Find files and process them using an external command.
# Usage:
#   ./finder.sh ./processing_script.sh txt fb2 fb2.zip doc docx

counter=0
find_results=()
for ext in "${@:2}"
do
    # @see https://stackoverflow.com/a/54561526/10452175
    readarray -d '' ext_results < <(find . -type f -name "*.${ext}" -print0)

    for file in "${ext_results[@]}"
    do
        counter=$((counter+1))
        find_results+=("${file}")
        echo ${counter}") ${file}"
    done
done
countOfResults=$((counter))
echo -e "Found ${countOfResults} files.\n"


echo "Processing..."
counter=0
for file in "${find_results[@]}"
do
    counter=$((counter+1))
    echo -n ${counter}"/${countOfResults}) "
    eval "$1 '${file}'"
done
echo "All files have been processed."

另一种方法是这样的:

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" -将导出它,以便任何其他subshell都可以看到它 “找到* . txt - bash - c”multiple_cmd“0”{}\;”-找到将在你的例子中执行函数

通过这种方式,multiple_cmd可以根据您的需要任意长和复杂。

希望这能有所帮助。

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

lastline.sh:

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

使脚本可执行

chmod +x lastline.sh

使用找到:

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

感谢Camilo Martin,我得以回答一个相关的问题:

我想做的是

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

但这并不奏效。然而,

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

确实有用,所以谢谢!

Find命令接受多个-exec部分。例如:

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

注意,在这种情况下,只有当第一个命令成功返回时,第二个命令才会运行,正如@Caleb提到的那样。如果你想让两个命令都运行,不管它们成功或失败,你可以使用这个结构:

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