bash终端上的echo / printf不完整命令

时间:2018-12-29 10:33:10

标签: bash terminal echo

在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之类的命令,如果这样,那是一个可以接受的答案。

过滤后,我需要处理的文件数量很小(<100)。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

以下似乎有效,使用户在提示符下完成命令:

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