Знайдіть та скопіюйте файли


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'

Відповіді:


273

Якщо ваша мета полягає в тому, щоб скопіювати знайдені файли в / home / shantanu / tosend, у вас є порядок аргументів, щоб cp було скасовано:

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

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


14
Яка мета \;?
Астрид

5
@Astrid перевірити це
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;чи щось не так у цій команді? це не працює
1818

2
Не працює, якщо в результатах є пробіл на шляху. Будь-які пропозиції щодо цього?
TheJeff

1
В Ubuntu 18 фігурні фігурні дужки також повинні бути поставлені в єдині лапки: знайти -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

я зіткнувся з такою проблемою ...

Насправді двома способами можна обробити findкомандний вихід у copyкоманді

  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 \;

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/
Toby Speight

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
Цю відповідь можна було б покращити та скоротити, якби в повному варіанті була надана повна команда.
Брайан


-2

Причиною цієї помилки є те, що ви намагаєтесь скопіювати папку, для якої потрібна опція -r, щоб також cp Спасибо


3
Привіт, оскільки на питання вже відповіли (час від часу) це насправді не відповідна відповідь, це також має бути коментар (коли у вас є ще кілька представників), якщо ви не хочете розширювати та пояснювати його. Тільки головами вгору :).
W1ll1amvl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.