Я пытаюсь скопировать только подмножество файлов из одного каталога в другой, используя 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
