неполная команда echo / printf на терминале bash - PullRequest
0 голосов
/ 29 декабря 2018

В приглашении BASH я могу find файлы, а затем добавить xargs для дальнейшей работы.например, find ... | xargs rm {}

Однако иногда есть ручной промежуточный шаг: я использую fzf, чтобы уточнить результаты find.

Я хотел бы использоватьэтот отфильтрованный список файлов для создания на терминале неполной xargs команды.

Например, если моя команда find выдаст file1 file2 file3, иmy fzf сужает это до file2 file3, я хотел бы, чтобы скрипт создал неполную строку в терминале следующим образом:

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

но я не хочу, чтобы команда сбрасывала (я не знаю, каков правильный термин), как если бы я нажал enter.Я хочу иметь возможность выполнить команду самостоятельно (например, rm {}), увидев список файлов, напечатанных в строке.

Команда find должна будет использовать опцию print0.

Полагаю, скрипт будет выглядеть примерно так:

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

команда echo -n - это не то, что мне нужно: она по-прежнему передает команду в оболочку BASH.

Может быть, есть лучший способ использовать find, затем вручную проверять и фильтровать, затем выполнять командукак rm или mv, и если это так, то это будет приемлемый ответ.

Количество файлов, с которыми мне нужно иметь дело после фильтрации, невелико (<100).</p>

Ответы [ 3 ]

0 голосов
/ 29 декабря 2018
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
0 голосов
/ 31 декабря 2018

Следующее, кажется, работает, оставляя пользователя для завершения команды в командной строке:

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 здесь

0 голосов
/ 29 декабря 2018

Похоже, что у fzf есть некоторые настройки evn, которые можно использовать для фильтрации набора данных, который возвращается.Также есть варианты env.Я хотел бы взглянуть на следующие переменные evn: FZF_DEFAULT_COMMAND и FZF_DEFAULT_OPTS.

FZF_DEFAULT_COMMAND позволит вам использовать другую команду для фильтрации вашего набора файлов.Проверьте следующее здесь

Это означает, что вам может не потребоваться использовать команду find и pipe для команды fzf.Вы можете просто начать с самой команды fzf и установить правильную переменную evn.

Чтобы использовать интерактивный режим для удаления и просмотра файлов в одной строке, вы можете сделать что-то вроде следующего.

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