Во-первых, поймите, что труба | команды links передают вывод первой во вторую в качестве аргумента. Оба ваших шелл-кода направляют вывод команды find в другие команды (grep и xargs). Давайте рассмотрим эти команды одну за другой:
Первая команда: найти
find — это программа для поиска файлов в иерархии каталогов (это объяснение из справочной страницы find). Синтаксис (в данном случае)
find <search directory> <search pattern> <action>
В обоих случаях каталогом поиска является . (это текущий каталог). Обратите внимание, что он ищет не только в текущем каталоге, но и во всех его подкаталогах (иерархия каталогов).
Шаблон поиска принимает опции -name (это означает, что он ищет файлы, имя которых соответствует шаблону, заданному в качестве аргумента этой опции) или -iname (то же самое, что и имя, но без учета регистра) среди прочих.
Шаблон действия может быть -print0 (печатать точное имя файла, включая его позицию в заданном каталоге поиска, т. е. относительный или абсолютный путь к файлу) или -exec (выполнить данную команду над файлом (файлами), команда состоит в том, чтобы заканчиваться на ; и каждый экземпляр {} заменяется именем файла).
То есть первый шелл-код (первая часть слева от пайпа)
find . -iname \*.jpg -print0
ищет все файлы с окончанием .jpg в текущей иерархии каталогов и печатает их пути и имена. Второй (первая часть)
find . -name '*' -exec file {} \;
находит все файлы в текущей иерархии каталогов и выполняет
file <filename>
на них. Файл — это еще одна команда, которая определяет и печатает тип файла (подробности смотрите на справочной странице, справочный файл).
Вторая команда: xargs
xargs — это команда, которая создает и выполняет командные строки из стандартного ввода (man xargs), то есть из результатов поиска, которые передаются в xargs. Команда, которую он создает и выполняет, в этом случае
cp -v {} /home/joachim/neu2"
Опция -I{} определяет строку замены, т. е. каждый экземпляр {} в команде должен быть заменен входными данными, полученными из файла (то есть именами файлов). Опция -0 определяет, что элементы ввода не заканчиваются (разделяются) пробелом или новой строкой, а только нулевым символом. Это кажется необходимым при использовании стандартного способа поиска вывода в качестве ввода xargs.
Созданная и выполняемая команда — это, конечно же, команда копирования с опцией -v (многословная), и она копирует каждое из имен файлов, полученных из find, в каталог.
Третья команда: grep
grep фильтрует свой ввод, выдавая только те строки или строки, которые соответствуют определенному шаблону вывода. Опция -o указывает grep напечатать только совпадающую строку, а не всю строку (см. man grep), -P указывает интерпретировать следующий шаблон как шаблон регулярного выражения Perl. В регулярном выражении perl ^ — это начало строки, .+ — любая произвольная строка, за этой произвольной должна следовать двоеточие, пробел, количество буквенно-цифровых символов (в регулярном выражении perl обозначается \w+), пробел и строка изображение. По сути, эта команда grep фильтрует вывод файла, чтобы выводить только те имена файлов, которые являются файлами изображений. (Почитайте, например, о регулярных выражениях perl здесь: http://www.comp.leeds.ac.uk/Perl/matching.html )
Команда, которую вы действительно хотели
Теперь то, что вы хотите сделать, это (1) взять вывод второй команды оболочки (в которой перечислены файлы изображений), (2) привести его в соответствующую форму и (3) передать его в команду xargs из первой команды оболочки. line (которая затем создает и выполняет нужную команду копирования). Итак, на этот раз у нас есть команда оболочки из трех (на самом деле четырех) этапов с двумя конвейерами. Не проблема. У нас уже есть этапы (1) и (3) (хотя на этапе (3) нам нужно пропустить опцию -0, потому что входные данные больше не находят выход; нам нужно, чтобы новые строки рассматривались как разделители элементов).
Стадия (2) по-прежнему отсутствует. Я предлагаю использовать для этого команду cut. cut изменяет строки py, разделяя их на разные поля (разделенные символом-разделителем в исходной строке), которые затем можно переупорядочить. Я выберу : в качестве символа-разделителя (это завершает имя файла в выводе grep, опция -d':') и скажу, чтобы он давал нам только первое поле (опция -f1, Essentialls: печатать только имя файла, а не часть который следует за :), т. е. этап (2) будет тогда
cut -d':' -f1
И вся команда, которую вы хотели, будет:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2
Обратите внимание, что вы можете найти все справочные страницы, например, здесь: http://www.linuxmanpages.com
person
0range
schedule
17.06.2014