【问题标题】:echo/printf incomplete command at bash terminalbash 终端上的 echo/printf 命令不完整
【发布时间】:2018-12-31 19:50:32
【问题描述】:

在 BASH 提示符下,我可以 find 文件然后附加 xargs 以做进一步的事情。例如find ... | xargs rm {}

但是,有时会有手动中间步骤:我使用fzf 来优化find 结果。

我想使用这个过滤后的文件列表在终端上创建一个不完整 xargs 命令。

例如,如果我的find 命令产生 file1 file2 file3,我的 fzf 缩小到 file2 file3,我希望脚本在终端上创建一个不完整的行,如下所示:

file2 file3 |xargs -0 --other-standard-options

但我不希望命令 flush(我不知道正确的术语是什么)好像我按下了enter。在看到打印在行上的文件列表后,我希望能够自己完成命令(例如rm {})。

find 命令需要使用print0 选项。

我想脚本应该是这样的:

find . | fzf -m | *echo incomplete xargs command*.

echo -n 命令不是我想要的:它仍然将命令传递给 BASH shell。

也许有更好的方法使用find,然后手动检查和过滤,然后执行rmmv 之类的命令,如果是这样,那将是一个可以接受的答案。

过滤后我需要能够处理的文件数量很少(

【问题讨论】:

    标签: bash terminal echo


    【解决方案1】:

    所以看起来 fzf 有一些 evn 设置,可用于过滤返回的数据集。还有选项 env 。我会看看以下 evn 变量: FZF_DEFAULT_COMMAND 和 FZF_DEFAULT_OPTS。

    FZF_DEFAULT_COMMAND 将允许您使用不同的命令来过滤您的文件集。查看以下here

    这意味着您可能不需要使用 find 并将其传递给 fzf 命令。您可以从 fzf 命令本身开始并设置正确的 evn 变量。

    要使用交互模式删除和查看同一行中的文件,您可以执行以下操作。

    find . -type f -name '*test*' | fzf -m | xargs rm
    

    【讨论】:

    • 环境变量确实有帮助;但我想在看到列表后编写 xargs(与您的示例不同),因为在看到被选中的文件之前我不会知道命令。
    • 我会查看External Programs 绑定,看看是否可以在交互模式下调用 fzf 选择文件并执行移动或删除命令。
    【解决方案2】:
    for f in $(find . -type f -name '*test*' | fzf -m); do 
       read -p ".... ${f} Enter command to insert on the dots "
       echo "$REPLY ${f}"
       $REPLY "${f}"
    done
    

    【讨论】:

    • 1) 这需要我为每个文件输入命令。我想对所有文件执行相同的命令 2)它需要处理 print0 因为某些文件名中的 \n 。 3)作为解释:有没有办法输入一个不完整的命令(即当你从历史中选择一个以前的命令时,bash会做什么,但允许你编辑它)?
    • 我不知道历史。当您想要一个命令用于所有文件时,您可以在调用 find .. print0 .. | xargs .. $REPLY .. 之前请求该命令吗?
    • 我想在确定命令之前查看find 的结果。
    • 您可以在处理数据之前先调用find,请求命令并再次调用find,现在使用for循环或xargs。如果您只想处理在输入命令之前看到的文件,请使用 mtime 标志。
    【解决方案3】:

    以下似乎可行,让用户在提示符下完成命令:

    out=$(find . |fzf -m )
    prefix="echo  ";
    suffix="| xargs  ";
    files="$(echo "${out}" | sed -e 's:^\.:"\.:g' -e 's:$:":g'|tr '\n' ' ' )";
    cmd="${prefix}${files}${suffix}" ;
    read -e -i "$cmd"; eval "$REPLY";
    

    解释:fzf 输出文件名,为了安全起见,我用双引号括起来;我要创建的终端命令如下所示:

    echo "file1" "file2" "file3"|xargs ....

    所有真正的功劳归于@meuh here

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 1970-01-01
      • 2012-11-23
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 2012-06-07
      • 1970-01-01
      相关资源
      最近更新 更多