Я пытаюсь скопировать только подмножество файлов из одного каталога в другой, используя cp
однако меня приветствует сообщение cp: cannot stat [^\.php]': No such file or directory
. Есть ли способ использовать регулярные выражения только с помощью команды cp
?
2 ответа
Нет.
Команда cp
не обладает способностью обрабатывать какие-либо свои аргументы как регулярные выражения. Даже подстановочные знаки не обрабатываются им (или большинством исполняемых файлов); скорее они обрабатываются оболочкой.
cp test/* test2/
фактически расширяется с помощью bash, и все, что cp
самом деле видит в своих аргументах, это cp test/file1 test/file2 test/file3 test2/
(или все, что подходит на основе фактического содержимого test/
).
Кроме того, я не думаю, что ваше выражение, [^\.php]
, будет соответствовать тому, что вы хотите (оно не соответствует только файлам, которые содержат .php
).
Возможно, вы захотите заглянуть в утилиту find
чтобы отфильтровать список файлов по регулярному выражению, а затем использовать xargs
чтобы применить возвращенный список файлов к команде cp
(при условии, что find не имеет встроенного обработчика для копирования файлов). Я не очень хорошо знаком с инструментом).
Вы можете попробовать:
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
, а затем инвертировать результаты !
,
Вы можете использовать несколько других инструментов из консоли, таких как grep и xargs.
ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder