Найдите и скопируйте файлы

128

Почему следующее не копирует файлы в папку назначения?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
shantanuo
источник

Ответы:

273

Если вы намерены скопировать найденные файлы в / home / shantanu / tosend, у вас есть обратный порядок аргументов для cp:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Примечание: команда поиска использует {} в качестве заполнителя для совпадающего файла

malcolmpdx
источник
14
В чем цель \;?
Astrid
5
@Astrid, проверь это
shellbye
find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;что-то не так с этой командой? это не работает
мт
2
Не работает, если в пути результатов есть пробел. Есть предложения по этому поводу?
TheJeff
1
В Ubuntu 18 фигурные скобки также необходимо заключать в одинарные кавычки: find -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo
32

я столкнулся с проблемой примерно так ...

Фактически, вы можете обрабатывать findвывод copyкоманды двумя способами в command

  1. Если findвывод команды не содержит пробелов, т.е. если имя файла не содержит пробелов, вы можете использовать указанную ниже команду:

    Синтаксис: find <Path> <Conditions> | xargs cp -t <copy file path>

    Пример: find -mtime -1 -type f | xargs cp -t inner/

  2. Но в большинстве случаев наши файлы производственных данных могут содержать в себе место. Таким образом, большую часть времени нижеприведенная команда более безопасна:

    Синтаксис: find <path> <condition> -exec cp '{}' <copy path> \;

    пример find -mtime -1 -type f -exec cp '{}' inner/ \;

Во втором примере последняя часть, то есть точка с запятой, также рассматривается как часть findкоманды, которую следует экранировать перед нажатием кнопки ввода. В противном случае вы получите сообщение об ошибке примерно такого вида

find: missing argument to `-exec'

В вашем случае синтаксис команды копирования неверен , чтобы скопировать файл поиска в /home/shantanu/tosend. Следующая команда будет работать:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;
Тиягу ATR
источник
3. Если у вас есть GNU find/ xargs, find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Пример:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Тоби Спейт
7

Вам нужно использовать cp -t /home/shantanu/tosend, чтобы сообщить ему, что аргумент является целевым каталогом, а не источником. Затем вы можете изменить его на -exec ... +, cpчтобы скопировать как можно больше файлов одновременно.

Игнасио Васкес-Абрамс
источник
2
В linux нужно было указать целевой каталог так: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM
3
Этот ответ можно было бы улучшить и сократить, если бы была предоставлена ​​полная команда, как в верхнем ответе.
Брайан
-1
for i in $(ls); do cp -r "$i" "$i"_dev; done;
Роберт А
источник
-2

Причина этой ошибки заключается в том, что вы пытаетесь скопировать папку, для которой требуется параметр -r, также для cp Спасибо

Себин Джон
источник
3
Привет, поскольку на вопрос уже дан ответ (некоторое время назад), это не совсем актуальный ответ, это также должен быть комментарий (когда у вас есть еще репутация), если вы не хотите его развернуть и объяснить. Просто предупреждаю :).
W1ll1amvl