LINUX.ORG.RU

Bash, проверка на существование файла в копируемой директории

 , ,


0

1

Условие -e проверяет существование пути, -f существование файла.

Допустим я указываю скрипту 2 аргумента.

В 1м аргументе путь до файла.

Во 2м аргументе путь до директории. Дальше будет копирование в эту директорию.

Думаю надо бы проверить нет ли файла с таким названием в директории, куда копируем, а то будет перезапись (возможно нежелательная).

Но как составить условие, чтобы отделить от первого аргумента название файла и подставить его в конец 2го аргумента?

Допустим 1й аргумент.

~/testdir/file.txt

2й аргумент директория, в которую копируем файл.

~/dir_for_files

Если пишу так-

if [[ -f $arg2/$arg1 ]]

То понятно что выйдет хрень и слепит 2 пути в один. Надо как-то отрезать последний кусок от 1го пути (файл) и добавить в конец 2го. Вдобавок я не уверен что -f подходит для такой цели. Он говорит «это является файлом», но проверяет ли по названию? Или эту проверку уже самому надо будет как-то придумать?

И непонятно как победить вот такой косяк-

///

Когда слепил 2 пути. Иногда в конце директории мы ставим /, иногда можем забыть поставить (но баш все-равно поймет что это директория), в любом случае получается лишний символ /.

На самом деле смотри Parameter Expansion. Опять же нет смысла пользоваться башем, если ты им не пользуешься.

///

такое вообще в принципе невозможно, если только это не пользовательский ввод и пользователь случайно ввёл путь с / в конце, когда у нас в скрипте что-то вида ${path}/${file}

anonymous ()
Ответ на: комментарий от anonymous

такое вообще в принципе невозможно, если только это не пользовательский ввод и пользователь случайно ввёл путь с / в конце, когда у нас в скрипте что-то вида ${path}/${file}

Автозаполнение табом и дает / в конце пути.

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

ничего страшного от /// не будет.

Надо же, и правда работает, ls по крайне мере не ругается на тройной слеш (насчет других программ не могу быть на 100% уверен). Но все-равно это как-то неправильно...

divlns ()

Думаю надо бы проверить нет ли файла с таким названием в директории, куда копируем, а то будет перезапись

Это ошибка. Между проверкой и перемещением проходит какое-то ненулевое время, за которое файл может создать другая программа. И тут он затрётся. Лучше позволить ОС за один шаг проверить проверить несуществование и произвести перемещение, тем более, что у mv есть ключик --no-clobber.

legolegs ★★★★★ ()