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