1

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

У меня есть сценарий оболочки dosomething.sh с shebang #!/bin/bash .

В этом сценарии у меня есть следующая строка для копирования файлов определенного типа из одного каталога в другой:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Когда скрипт выполняется, ничего не копируется. Я уверен, что это лишь незначительная вещь, которую мне не хватает. Вопрос в том, что?


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

1 ответ1

0

Благодаря комментариям, я смог решить эту проблему. Это отредактированная версия моего предыдущего ответа, потому что он был признан недостаточным и вызвал больше вопросов, чем ответил.

Поэтому здесь я пытаюсь описать каждую проблему, которая привела к самой проблеме и как я решил ее.


Попытка №1: - Неправильный синтаксис mv ?

Из скрипта следующая строка ничего не сделала:

find "/var/www/analysis_xyz/" -name '*log.gz' -exec mv -f {} "/media/pi/MOBIDICDATA" \;

Я не был уверен, смогу ли я использовать стандартные параметры mv при вызове его из -exec , но я добавил параметр -f для перезаписи существующих файлов в целевом каталоге в любом случае.

Добавив в сценарий set -x как было предложено, я получил сообщение об ошибке, в котором говорилось, что с аргументами команды mv что-то не так. Поэтому я удалил параметр -f . Без успеха. Погуглив немного дальше и увидев несколько примеров, которые все использовали параметр -t , я добавил его. Опять же, безуспешно, вместо этого я получил сообщение об ошибке, в котором говорится, что ожидается каталог, который я неправильно истолковал (извините, немного нуба относительно сценариев оболочки). В этот момент у меня был следующий синтаксис, который позже оказался абсолютно правильным и работающим:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /media/pi/MOBIDICDATA \;

(обратите внимание на перемещенный {}). Но на данный момент проблема все еще не решена, и я даже не был уверен, были ли ее части -f и -t .


Попытка № 2: - Я пытаюсь записать на USB-флешку только для чтения?

Как вы могли заметить, целевой папкой является /media/pi/… Так что вы, возможно, знаете, что я использую Raspberry Pi и использую Raspbian. USB-накопитель, на который я хотел записать данные, автоматически монтируется в эту папку (при условии, что устройство называется MOBIDICDATA . Автоматическое монтирование монтирует устройство только для чтения (и в этот момент я понятия не имел, почему). Это привело к выполнению процесса, но файлы не были скопированы, и появилось сообщение об ошибке, в котором говорилось, что устройство доступно только для чтения.

Я решил не полагаться на автоматическое монтирование и сам монтировать устройство при перезагрузке в другое место. Новая цель была /mobidicdata . Устройство было успешно установлено, но по какой-то причине все еще было доступно только для чтения.


Попытка № 3: - Коротка ли жизнь, чтобы безопасно удалить USB?

Раньше я буквально убивал 2 USB-устройства, безопасно удаляя их с ПК с Windows, поэтому я решил больше этого не делать, поскольку я никогда не убивал устройство, просто вытаскивая его. Мало ли я знал, что, например, USB-флешки, которые просто извлекаются, всегда монтируются только для чтения на большинстве систем, отличных от Windows; что имеет смысл, поскольку файловая система может быть повреждена и привести к другим проблемам. Узнав об этом, я благополучно извлек USB-устройство, установил его, и теперь оно было ч / б.

Итак, протестируйте снова с записывающим устройством и следующим синтаксисом:

find /var/www/analysis_xyz/ -name '*log.gz' -exec mv {} -t /mobidicdata \;

... который работал.

Для меня это было немного Одисее.


Резюме

Да, параметр -t/-f не был проблемой, как упоминалось ранее. Это был скорее кластер с несколькими проблемами, который я уже должен был описать более подробно ранее.

Я надеюсь пролить некоторый свет на все это и то, что я знаю с этого момента и буду делать в будущем:

  • Вы определенно должны безопасно удалить USB

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

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