Как настроить команду find для запуска в сценарии оболочки Linux? - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь запустить следующую команду поиска в сценарии оболочки Linux.Когда я запускаю команду в терминале, она успешно находит все файлы с расширением .mp4 из указанной папки и копирует их во временную папку.

find /datadrive/reports/ -name \*.mp4 -exec cp {} 
/datadrive/reports/video_tmp/ \;

Однако, когда я запускаю ее вмой file_mover.sh

код:

SHELL=/bin/bash
PATH=~/find /datadrive/reports/ -name '\*.mp4' -exec cp {} 
/datadrive/reports/video_tmp/ \;
done
MAILTO=root

Вывод:

./file_mover.sh: line 2: /datadrive/reports/: Is a directory.

Я думаю, что где-то в скрипте отсутствует синтаксис, и любая помощь будет оценена.

1 Ответ

0 голосов
/ 13 июня 2018

Следующий скрипт является абсолютно корректным:

#!/bin/sh
find /datadrive/reports/ -name '*.mp4' -exec cp -t /datadrive/reports/video_tmp/ '{}' +

Обратите внимание на изменения:

  • Мы не пытаемся присвоить PATH.Это переменная со специальным значением (она определяет, где находятся программы), поэтому ее переназначение обычно приводит к путанице.
  • Мы не используем обратную косую черту внутри одинарных кавычек.-name \*.mp4 допустимо как совпадение для всех файлов, заканчивающихся на .mp4.-name '*.mp4' является законным для той же цели.Вы не можете объединить два, и это все равно будет означать то, что вы хотите.
  • Используя cp -t dest source1 source2 ..., мы позволяем find запускать cp самое короткое число раз, необходимое дляимена файлов назначения в командной строке.

Также нет смысла присваивать SHELL и MAILTO;они имеют смысл в crontab (и некоторых других специфических / узких обстоятельствах), но не в скрипте общего назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...