Нет.
Команда 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 \;будьте осторожны с файлами со специальными символами.