使用终端输出多次执行命令

时间:2017-06-16 22:51:48

标签: bash macos terminal delete-file

我正在尝试执行以下操作:

mdfind -name "application name"

作为输出我得到:

/Applications/[Application]
~/Library/LaunchAgents/[Application]
...

我想做的下一步是:

sudo rm -rif "/Applications/[Application]"
sudo rm -rif "~/Library/LaunchAgents/[Application]"
...

所以在这种情况下,我必须多次sudo rm -rif "/..."次。如何对所有给定目录重复自动应用此删除命令?

P.S。将输出分为字符串数组并启动for-loop不是一种选择。

2 个答案:

答案 0 :(得分:1)

正如我们现在所知,您首先要在执行实际删除之前向用户提供mdfind输出以进行确认。

Barmar's answer可以帮助你完成大部分工作,但是 - 在撰写本文时 - 执行实际删除的方式既脆弱又效率低。 [1]

这是一个强有力的替代方案,只做出一个假设:没有路径有嵌入的换行符(非常罕见)。

#!/bin/bash

# Determine the paths of the items to delete.
files=$(mdfind -name "application name")

# Present the paths to the user and ask for confirmation.
printf '%s\n' "$files"
read -p "OK to delete (y/N)? "
[[ $REPLY == [yY] ]] || { echo "Aborted." >&2; exit 2; }

# Perform batch deletion, passing (typically) *all* paths to `sudo rm -rf` *at once*.
printf '%s\n' "$files" | tr '\n' '\0' | xargs -0 sudo rm -rf

请注意,如果删除之前没有显示路径,您可以使用mdfind -0 -name "application name"生成NUL - 分隔输出以传递给{直接{1}}。

由于shell变量不能包含嵌入式xargs -0NUL - 首先生成分隔输出以供显示,然后转换为\n - 用{{1}分隔输出},NUL

使用tr - 一致的分离输出是最强大的选项,因为即使是嵌入换行符的路径也能正确处理。

在目前的情况下,首先需要在临时文件中缓存xargs -0输出,鉴于嵌入的文件名,上述解决方案为了方便和简洁而这样做换行极为罕见。

[1]以下几点涉及边缘情况,但了解 可能会出现问题非常重要:
* NUL没有mdfind选项会对read字符的解释进行输入 * -r没有将\设置为空字符串(read)修剪前导和尾随空格。
为每个文件名调用IFS一次效率低于一次传递所有文件名

答案 1 :(得分:-1)

将输出放在变量中,并将其显示给用户。然后将变量传递给执行命令的循环:

files=$(mdfind -name "application name")
echo "$files"
read -p "OK to delete? " ok
if [[ $ok =~ ^y ]]
then 
    echo "$files" | while read -r filename; do
        sudo rm -rif "$filename"
    done
fi