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'?

0
задан 15 March 2019 в 00:23

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
1
ответ дан 26 October 2019 в 01:13

То, что можно сделать, является использованием 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 является действительно инструментом для прямого потребления человеком, и в этом случае последующая обработка менее полезна. Для дальнейшей обработки найдите (1), больше подходит.

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

xclip -sel clip < /etc/passwd

Копирование имени файла в командной строке может быть проблематичным из-за специальных символов, таких как вкладки, новые строки, пробелы. Обычно в командной строке Вы использовали бы find. Инструменты Filemanagers и 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 и позже вставленный в строку поиска веб-браузера. Наутилус и диалоговые окна Выбора Файла, кажется, не поддерживают вставку это от буфера обмена простого текста все же.

См. также

0
ответ дан 26 October 2019 в 01:13

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

Похожие вопросы: