21

Я пытаюсь скопировать только подмножество файлов из одного каталога в другой, используя cp однако меня приветствует сообщение cp: cannot stat [^\.php]': No such file or directory . Есть ли способ использовать регулярные выражения только с помощью команды cp ?

2 ответа2

25

Нет.

Команда 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 , а затем инвертировать результаты ! ,

9

Вы можете использовать несколько других инструментов из консоли, таких как grep и xargs.

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .