xclip выход из головы и хвоста

Я намереваюсь скопировать вывод из ls

gaowei@alpha:~/Downloads$ ls | head -n 10 | tail -n 5
Abraham Silberschatz, Greg Gagne, Peter B. Galvin - Operating System Concepts (2018, Wiley).pdf
Alan Shalloway - Design Patterns Explained_ A New Perspective on Object-Oriented Design (2004, Addison-Wesley Professional).pdf
Alan Shalloway, James R. Trott - Design patterns explained a new perspective on object-oriented design (2004, Addison-Wesley Professional).chm
Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman - Compilers - Principles, Techniques, and Tools (2006, Pearson_Addison Wesley).pdf
Anany Levitin - Introduction to the Design and Analysis of Algorithms (2012, Pearson).pdf

и попробовал

me@host:~/Downloads$ ls | head -n 10 | tail -n 5 | xargs xclip -sel clip
xclip: Abraham: No such file or directory
me@host:~/Downloads$ xclip -sel clip $(ls | head -n 10 | tail -n 5)
xclip: Abraham: No such file or directory

Они потерпели неудачу. Должен ли я перенаправить вывод в файл, прежде чем использовать 'xclip'?

2 ответа

Решение

Чтобы передатьимена файлов из вашего канала в xclip, все, что тебе нужно

ls | head -n 10 | tail -n 5 | xclip -sel clip

так как xclip по умолчанию читает текст из стандартного ввода.


Добавляя xargsвы передавали вывод канала в виде последовательности аргументов имени файла xclip, что в принципе было бы способом скопировать содержимое файлов в буфер обмена, однако это не помогло, потому что по умолчанию xargs рассматривает каждое слово, разделенное пробелом, как отдельный аргумент - если вы действительно хотите скопировать содержимое файла в буфер обмена, можно обойти это xargs использовать разделитель новой строки:

ls | head -n 10 | tail -n 5 | xargs -d '\n' xclip -sel clip

или, что еще лучше (поскольку символ новой строки на самом деле является допустимым - хотя и редко используется - символ в именах файлов), сделайте весь конвейер разделенным нулями:

printf '%s\0' * | head -zn 10 | tail -zn 5 | xargs -0 xclip -sel clip

Что вы можете сделать, это использовать find напечатать имя файла используя -name или же -iname флаг. xclip принимает ввод через stdin, поэтому все, что вам нужно сделать, это отправить имя файла по каналу.

$ find -maxdepth 1  -type f -name 'Abraham*Operating Systems*pdf'  -printf '%P\n' | xclip -sel clip

-name/-iname флаги используют простое сопоставление с образцом и -printf с с %P спецификатор формата выведет только имя файла. Обратите внимание, что find предполагает текущий рабочий каталог . если каталог не указан.


Что касается вашей оригинальной команды

$ ls | head -n 10 | tail -n 5 | xargs xclip -sel clip

есть несколько проблем с этим. Один разбирает ls (чтение его вывода с помощью команды), что обычно не рекомендуется. Вывод может содержать символы управления цветом и другую информацию. Фактически были предложения добавить флаг опции к ls так что он может выводить элементы, разделенные \0 символ (это безопасный метод), но он был отклонен разработчиками GNU по понятным причинам:

Однако ls действительно инструмент для непосредственного потребления человеком, и в этом случае дальнейшая обработка менее полезна. Для дальнейшей обработки find(1) больше подходит.

Другая проблема с вашей оригинальной командой xargs использование здесь. xclip может читать ввод из stdin просто отлично, поэтому, если вы хотите отправить текст в буфер обмена, достаточно просто сделать что-то вроде echo foo | xclip -sel clip, Если вы хотите скопировать содержимое файла, то вы должны сделать этот файл стандартным

xclip -sel clip < /etc/passwd

Копирование имени файла в командной строке может быть проблематичным из-за специальных символов, таких как табуляция, новые строки, пробелы. Обычно в командной строке вы бы использовали find, Файловые менеджеры и инструменты GUI используют URI-форму имен файлов, где специальные символы и символы UTF-8 заменяются шестнадцатеричными значениями. Например,

$ gio info --attributes='uri:'   文er-\ 林中鸟\ -\ 林中鳥-YY神曲-uUX0sZHQMkw.mp3 | awk '/uri:/{print $2}'
file:///home/xie/%E6%96%87er-%20%E6%9E%97%E4%B8%AD%E9%B8%9F%20-%20%E6%9E%97%E4%B8%AD%E9%B3%A5-YY%E7%A5%9E%E6%9B%B2-uUX0sZHQMkw.mp3

Это можно передать xclip и позже вставил в адресную строку веб-браузера. Диалоги Nautilus и File Selection, похоже, не поддерживают вставку этого из обычного текстового буфера обмена.

Смотрите также

Другие вопросы по тегам