在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
,然后手动进行检查和过滤,然后执行诸如rm
或mv
之类的命令,如果这样,那是一个可以接受的答案。
过滤后,我需要处理的文件数量很小(<100)。
答案 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