Как скопировать файлы из папки с помощью команды find с действием -exec или с помощью xargs в другую папку

Я хотел бы использовать команду find с действием -exec со знаком плюс (+) (для эффективности) или с xargs для копирования файлов из одного каталога в другой. Следующий ответ не помог мне. Я под версией bash: 4.3.48 (1). Попытка:

find . \( \( -type f -size -2M \) -o \( -type f -size 2M \) \) -exec cp '{}' ~/Pictures/test_folder '+'

или:

find . \( -type f -size -2M \) -o \( -type f -size 2M \) | xargs cp -t ~/Pictures/test_folder

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

0
задан 8 November 2017 в 08:44

3 ответа

Я ожидаю, что это сработает:

find . -type f \( -size -2M -o -size 2M \) -exec cp -t ~/Pictures/test_folder {} +

(я вынул общий тест -type f.)

С +, {} как ожидается, будет последним элементом в команде -exec. Из руководства поиска GNU:

В команде допускается только один {}, и он должен появиться в конце, непосредственно перед +. A +, появляющийся в любой позиции, кроме сразу после {}, не считается специальным (то есть он не прерывает команду).

Если вы используете find и xargs, не забудьте использовать опции -print0 и -0:

find ... -print0 | xargs -0 cp -t ...

С -print0 имена файлов ограничены символ ASCII NUL, единственный, который не разрешен в путях. Без этого xargs может разбивать имена файлов на пробелы, поэтому ./file1 - foo.txt будет отображаться как ./file1, - и foo.txt командой cp.

3
ответ дан 22 May 2018 в 16:25
  • 1
    Таким образом, это означает комментарий в ссылке, которую я представил о том, чтобы поместить {}, прежде чем путь к команде cp был определенно неправильным, предполагая, что они используют GNU find. Теперь я хотел бы знать, как я делаю то же самое, но с командой xargs. – John_Patrick_Mason 8 November 2017 в 08:53
  • 2
    @John_Patrick_Mason, о ком вы говорите? Никакой комментарий или ответ не использует -exec cp {} ... +. Это либо -exec cp -t ... {} +, либо -exec cp {} ... \;. Что касается xargs, см. Править. – muru 8 November 2017 в 08:56
  • 3
    Вы правы, но, честно говоря, третий комментарий в ссылке должен был быть более конкретным, вместо того, чтобы сообщать OP просто добавить +; в конец команды. – John_Patrick_Mason 8 November 2017 в 09:04
  • 4
    Спасибо muru, это решило мою проблему. Я отмечаю это как решение. – John_Patrick_Mason 8 November 2017 в 09:15

Я ожидаю, что это сработает:

find . -type f \( -size -2M -o -size 2M \) -exec cp -t ~/Pictures/test_folder {} +

(я вынул общий тест -type f.)

С +, {} как ожидается, будет последним элементом в команде -exec. Из руководства поиска GNU:

В команде допускается только один {}, и он должен появиться в конце, непосредственно перед +. A +, появляющийся в любой позиции, кроме сразу после {}, не считается специальным (то есть он не прерывает команду).

Если вы используете find и xargs, не забудьте использовать опции -print0 и -0:

find ... -print0 | xargs -0 cp -t ...

С -print0 имена файлов ограничены символ ASCII NUL, единственный, который не разрешен в путях. Без этого xargs может разбивать имена файлов на пробелы, поэтому ./file1 - foo.txt будет отображаться как ./file1, - и foo.txt командой cp.

3
ответ дан 18 July 2018 в 03:40

Я ожидаю, что это сработает:

find . -type f \( -size -2M -o -size 2M \) -exec cp -t ~/Pictures/test_folder {} +

(я вынул общий тест -type f.)

С +, {} как ожидается, будет последним элементом в команде -exec. Из руководства поиска GNU:

В команде допускается только один {}, и он должен появиться в конце, непосредственно перед +. A +, появляющийся в любой позиции, кроме сразу после {}, не считается специальным (то есть он не прерывает команду).

Если вы используете find и xargs, не забудьте использовать опции -print0 и -0:

find ... -print0 | xargs -0 cp -t ...

С -print0 имена файлов ограничены символ ASCII NUL, единственный, который не разрешен в путях. Без этого xargs может разбивать имена файлов на пробелы, поэтому ./file1 - foo.txt будет отображаться как ./file1, - и foo.txt командой cp.

3
ответ дан 24 July 2018 в 17:54

Другие вопросы по тегам:

Похожие вопросы: