Нет.
Команда cp
не обладает способностью обрабатывать любые свои аргументы как регулярные выражения. Даже подстановочные знаки не обрабатываются им (или большинством исполняемых файлов); скорее они обрабатываются оболочкой.
cp test/* test2/
фактически расширяется с помощью bash, и все, что на cp
самом деле видит его аргументы cp test/file1 test/file2 test/file3 test2/
(или все, что подходит на основе фактического содержимого test/
).
Кроме того, я не думаю, что ваше выражение [^\.php]
будет соответствовать тому, что вы хотите (оно не соответствует только файлам, которые содержат .php
).
Возможно, вы захотите заглянуть в find
утилиту, чтобы отфильтровать список файлов по регулярному выражению, а затем использовать xargs
для применения возвращенного списка файлов к cp
команде (предположим, что find не имеет встроенного обработчика для копирования файлов; I ' я не очень знаком с инструментом).
Вы можете попробовать:
find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;
Это говорит о необходимости рекурсивного поиска в текущем каталоге файлов, которые не содержат «.php» в пути, и копирования их в /destination/folder/
.
В соответствии с просьбой, более конкретная разбивка аргументов:
.
- Местоположение для начала поиска - в данном случае текущий каталог
!
- оператор "Не", инвертировать результат следующего теста
-iregex
- Нечувствительный к регистру тест регулярных выражений. Следующий аргумент - это выражение.
".*\.php.*"
- Соответствие регулярному выражению <Anything>.php<Anything>
- Любой файл, который имеет «.php» где-то в пути. (Обратите внимание, что, находясь внутри папки, в имени которой содержится «.php», вам понадобится более сложное выражение, чтобы соответствовать только файлам).
-exec
- Выполните команду, если предыдущие тесты вернули true. Следующий аргумент - это команда, все оставшиеся аргументы ;
передаются команде. {}
это особый аргумент , представляющий имя файла.
cp
- Команда find` должна запускаться на каждом из совпадающих путей.
{}
- Путь к файлу, который был найден, передан cp
в качестве аргумента, чтобы он знал, какой файл копировать
/destination/folder/
- передан аргумент cp
, указывающий, cp
куда следует скопировать файл.
\;
- Это тот ;
терминатор, который -exec
ищет. Мы избегаем его с помощью \
так, чтобы ваша оболочка не пыталась его проанализировать, а вместо этого подала его в качестве аргумента команды ( find
)
Это довольно трудно написать регулярное выражение , которое соответствует «строке , которые не имеют .php
», так что мы вместо того, чтобы сказать , find
для поиска строк , которые действительно содержат , .php
а затем инвертировать результаты с !
.
find . -name [^\.php] -exec cp {} /path/to/location \;
будьте осторожны с файлами со специальными символами.cp
и другие двоичные файлы не могли расширять регулярные выражения. Не могли бы вы уточнить, что означает каждый из вариантов и аргументов в приведенном вами примере? Я знаю , что.
относится к текущей директории , но что делать!
,{}
,\;
и т.д. см , а также то , что они означают? Например, почему вы должны избежать;
?find . -name '[^\.txt]' -exec rm {} \;
следовательно, моим нежеланием пользоватьсяfind
. Вероятно, ошибка с моей стороны, но я не уверен, что я сделал не так. Насколько я понимаю,{}
относится к каждому файлу, найденному командойfind . -name '[^\.txt]'
Вы можете использовать несколько других инструментов из консоли, таких как grep и xargs.
источник
{}
отличается от этого-t
?Вы можете запустить следующую команду, простую в использовании:
круто хаа !!
источник