У меня есть коллекция файлов (* .zip, * .txt, * .tar.gz, * .doc, ... и т. Д.). Эти файлы находятся в пути. Я хочу найти все файлы (* .txt), а затем скопировать только текстовые файлы, содержащие определенные слова (например, LINUX / UNIX).
Я запустил следующее:
find . -name "*.txt" | grep 'LINUX/UNIX'
Эта команда смогла найти все текстовые файлы, а затем «grep» отфильтровывает результирующие текстовые файлы, перечисляя только текстовые файлы, которые содержат «LINUX / UNIX».
Как я могу скопировать эти окончательные файлы (т.е. текстовые файлы, которые содержат 'LINUX / UNIX') по определенному пути выбора?
Я пытался подать заявку xargs
find . -name "*.txt" | grep 'LINUX/UNIX' | xargs cp <to a path>
Но это не сработало
Ответы:
Пытаться:
Поскольку эта команда использует NUL-разделение, она безопасна для всех имен файлов, в том числе со сложными именами, которые включают пробелы, табуляции или даже переводы строк.
Выше требуется GNU
cp
. Для MacOS / FreeBSD попробуйте:Как это работает:
grep
варианты и аргументы-r
сообщает grep рекурсивный поиск по структуре каталогов. (В FreeBSD-r
будут следовать символические ссылки в каталоги. Это не относится ни к OS / X, ни к последним версиям GNUgrep
.)--include '*.txt'
говорит grep, что нужно возвращать только те файлы, имена которых совпадают с глобусом*.txt
(включая скрытые, такие как.foo.txt
или.txt
).-l
говорит grep, что нужно возвращать только имена совпадающих файлов, а не само совпадение.--null
говорит grep использовать NUL-символы для разделения имен файлов. (--null
поддерживаетсяgrep
в GNU / Linux , MacOS и FreeBSD, но не в OpenBSD .)LINUX/UNIX
говорит grep искать только те файлы, содержимое которых включает регулярное выражениеLINUX/UNIX
.
поиск в текущем каталоге. Вы можете опустить его в последних версиях GNUgrep
, но тогда вам нужно будет передать--
терминатор опцииcp
для защиты от имен файлов, которые начинаются с-
.xargs
варианты и аргументы-0
сообщает Xargs, что следует ожидать ввода NUL.-r
говорит xargs не запускать команду, если не найден хотя бы один файл. (Эта опция не нужна ни для BSD, ни для OSX и не совместима с OSXxargs
.)cp -t /path/to/dest
копирует каталоги в целевой каталог. (-t
требуется GNUcp
.)источник
cp -t
только для Linux.--null
и добавил версию для BSD / OSX, которая не используетcp -t
.grep
не имеет--null
.--null
.Более переносимо (только функции POSIX):
источник
Следующий sh / Bash one liner - это другой метод, хотя он будет работать только в текущем каталоге и не повторяться:
-l
Возможность Grep напечатает список файлов , которые копируемые, хотя вы могли бы использовать ,-q
если вы не хотите , чтобы увидеть что - либо на экране.источник
Я не уверен, почему оригинальная строка не работала. Следующая команда работает для меня.
найти / -имя (имя файла *) | grep '(filename.extention)' | xargs cp -t ./
В моем случае filename * - это набор файлов с одинаковыми именами с разными типами файлов (txt, zip и т. Д.). Я делаю grep, чтобы узнать только filename.txt и скопировать его в мой каталог назначения (который в настоящее время ./).
источник