Получить возвращаемое значение команды "mv -n" linux - PullRequest
1 голос
/ 07 августа 2020

From mv --help

-n, --no-clobber do not overwrite an existing file

user@pc:~/Desktop/test$ ls -l
total 16
-rw-r--r-- 1 user user 0 ago  6 20:28 bla
-rw-r--r-- 1 user user 0 ago  6 20:28 ble
user@pc:~/Desktop/test$ mv -n bla ble
user@pc:~/Desktop/test$

Есть ли способ проверить возвращаемое значение команды mv -n?

Можно ли сделать что-то подобное $?, чтобы узнать, успешно ли команда (вернула 0) при перемещении файла или не удалась (вернула 1), потому что в целевой папке уже есть другой файл с тем же именем?

Ответы [ 3 ]

2 голосов
/ 07 августа 2020

Нет, $? не сообщит вам, помешал ли параметр -n выполнить перемещение mv, поскольку в этом случае статус выхода будет равен 0.

Решение 1: вы можете проверить, что исходный файл не перемещался ...

mv -n file1 file2
[ -e file1 ] && echo "Hmmm, mv didn't have any effect"

Однако существует вероятность состояния гонки, если другая программа воссоздает файл1 между перемещением и ваш тест.

Решение 2: поскольку вы, кажется, используете GNU mv, опция -v может быть полезна, чтобы узнать, удалось ли перемещение

if mv -v -n file1 file2 | grep -q .; then
    echo "The move succeeded"
fi

С -v, если перемещение происходит, mv выведет renamed 'file1' -> 'file2'. Передача по конвейеру его вывода на grep -q . проверяет, выводит ли mv что-либо на свой стандартный вывод.

Если есть ошибка, mv будет выводить стандартную ошибку, а grep тоже не работает.

0 голосов
/ 08 августа 2020

Вместо того, чтобы пытаться выполнить перемещение, а затем проверять, не удалось ли выполнить перемещение из-за того, что целевой файл существует, просто проверьте, существует ли целевой файл, прежде чем пытаться выполнить перемещение, например:

[[ ! -f ble ]] && mv bla ble || { ret=$?; echo "failed to move bla to ble: $ret" >&2; exit "$ret"; }

Это будет выведите сообщение об ошибке, если существует ble или mv не работает, и он завершается при сбое, массируйте, например, возможно, вы предпочитаете:

[[ -f ble ]] && { ret=$?; echo "warning ble exists so skipping it" >&2; }
[[ $ret == 0 ]] && mv bla ble

или простое if-else:

if [[ -f ble ]]; then
    echo "warning ble exists so skipping it" >&2
else
    mv bla ble
fi
0 голосов
/ 07 августа 2020

как насчет сравнения отметок времени файлов до и после cmd. Что-то похожее на: https://github.com/shasan101/bash_for_fun/blob/master/files_comparison_by_time.sh

...