LINUX.ORG.RU

Как заставить mv не сигнализировать об ошибке, если файл не найден?

 ,


0

1

В скрипте есть команда

mv errors.log errors-$currentBuild.log
Если в текущем цикле errors.log не создаётся, весь скрипт возвращает ошибку. Можно сделать проверку наличия errors.log, наподобие
if [ -e errors.log ] 
    then mv errors.log errors-$currentBuild.log 
fi
но это ещё больше запутает скрипт. Можно сделать так:
mv errors.log errors-$currentBuild.log || true
но мне это решение не нравится тем, что прячет все остальные ошибки.

Существует ли какой-нибудь переключатель для mv или другой способ, чтобы пропускать несуществующие файлы, не генерируя ошибок?

★★★

Последнее исправление: olegd (всего исправлений: 1)
$ mv nonexistent.file
mv: missing destination file operand after 'nonexistent.file'
Try 'mv --help' for more information.
$ mv nonexistent.file > /dev/null 2>&1
$ mv nonexistent.file existent.file
mv: cannot stat 'nonexistent.file': No such file or directory
$ mv nonexistent.file existent.file > /dev/null 2>&1
nerve ★★
()
Последнее исправление: nerve (всего исправлений: 2)
Ответ на: комментарий от nerve

$ mv nonexistent.file > /dev/null 2>&1

В этом случае всё равно возвращает сигнал об ошибке. Поэтому лучше сделать

mv nonexistent.file || true

И то, и другое прячут все ошибки, а не только отсутствие файла, как я написал выше.

olegd ★★★
() автор топика

Видите ли, mv вызывает сискол для переименования, а не проверяет предварительно наличие файла, так как это не только лишнее, но и вредное — файл может исчезнуть между вызовами сисколов. Потому ваше желание в конце концов и приведёт к коду [ -e «$file» ] под вашу ответственность в виде гонки - «файл был, но исчез до переименования»

vodz ★★★★★
()

[ -e errors.log ] && mv errors.log errors-$currentBuild.log

logrotate умеет пропускать несуществующие файлы...

vel ★★★★★
()

Если в текущем цикле errors.log не создаётся, весь скрипт возвращает ошибку.

хм..

$ mv nonexistent.file existent.file; echo bla
mv: cannot stat 'nonexistent.file': No such file or directory
bla

nerve ★★
()
Ответ на: комментарий от vodz

mv вызывает сискол для переименования, а не проверяет предварительно наличие файла

А как насчёт chmod и chown? Так же работают?

Потому ваше желание в конце концов и приведёт к коду [ -e «$file» ] под вашу ответственность в виде гонки - «файл был, но исчез до переименования»

Возможно, но такой сценарий возникнуть не должен. Лог может наличествовать, если было что туда писать, либо отсутствовать за ненадобностью. Но он не должен исчезать в процессе.

olegd ★★★
() автор топика
Ответ на: комментарий от vel

[ -e errors.log ] && mv errors.log errors-$currentBuild.log

Спасибо, так будет короче.

olegd ★★★
() автор топика
Ответ на: комментарий от vodz

Вы похоже так и не поняли, что ТС имеет в виду код ошибки, а не сообщение.

Именно.

olegd ★★★
() автор топика
Ответ на: комментарий от olegd

А как насчёт chmod и chown? Так же работают?

Ну да. Оно, конечно, от появления комбайнов с кучей ключей никто не застрахован, но лучше довольствоваться набором posix ключей для совместимости.

Ваше желание не юзать дополнительный код в вашем скрипте для реализации конкретного условия задачи — не понятно.

vodz ★★★★★
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от IPR

2>/dev/null

Выше уже писал. Мешают не сообщения в stderr. Мешает устанавливаемый mv код ошибки.

olegd ★★★
() автор топика
Ответ на: комментарий от MumiyTroll

mv -f ... ...

$ ls 3 4
ls: cannot access '3': No such file or directory
ls: cannot access '4': No such file or directory
$ mv -f 3 4 && echo success
mv: cannot stat '3': No such file or directory
olegd ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.