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, похоже, не поддерживают вставку этого из обычного текстового буфера обмена.