Случайное перемещение файлов и папок в несуществующие места - PullRequest
5 голосов
/ 01 мая 2009

Я часто делаю такие команды, как:

mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist

Тогда я понимаю, что мои файлы исчезли. Я не вижу их даже в папке "$thing_that_does_not_exist". Куда делись мои файлы и папки? Как я могу вернуть их?

Ответы [ 5 ]

8 голосов
/ 01 мая 2009

Для предотвращения этой проблемы у меня есть привычка всегда добавлять / в конец имен каталогов при использовании cp или mv:

$ touch foo
$ mv foo bar/
mv: cannot move `foo' to `bar/foo': No such file or directory

Без косой черты mv выполняет операцию переименования файла. Вы можете обнаружить, что ваши файлы изменили имя.

2 голосов
/ 01 мая 2009

Если $something_that_does_not_exist расширится до нуля (но я не уверен, что это ваша проблема?), То первый mv потерпит неудачу. Вторая команда mv также не будет выполнена, если "files*" не расширится ровно до двух файлов или если последнее имя файла "files*" не расширится, чтобы оказаться каталогом. Затем файлы будут перемещены в этот каталог.

Если команда находится в скрипте и вы хотите, чтобы ваш скрипт прерывался при попытке раскрыть переменную, но она не задана, вы можете использовать модификатор вопросительного знака. Пример:

$ echo ${DISPLAY?}; echo display
:0.0
display
$ echo ${MYTEST?}; echo mytest
bash: MYTEST: parameter null or not set
$

Так что, если вы используете

mv folder ${something_that_does_not_exist?}

и something_that_does_not_exist не установлены, следующие команды не будут выполняться.

0 голосов
/ 01 мая 2009

1) Вы пытаетесь переместить каталог «папка»:

mv folder abcde

Если «abcde» является существующим каталогом, он переместит «folder» в «abcde». Если «abcde» является существующим файлом, команда не будет выполнена. В противном случае он переименует «папка» в «abcde».

2) Вы пытаетесь переместить несколько файлов:

mv files* abcde

Если «abcde» является существующим каталогом, он переместит «files *» в «abcde». В противном случае, если существует только один файл, соответствующий «files *», он переименует этот файл в «abcde». В противном случае команда не будет выполнена.

0 голосов
/ 01 мая 2009
mv folder $something_that_does_not_exist

Это должно быть ошибкой:

$ mkdir folder
$ mv folder
mv: Insufficient arguments (1)
Usage: mv [-f] [-i] f1 f2
       mv [-f] [-i] f1 ... fn d1
       mv [-f] [-i] d1 d2

Другой случай зависит от того, что files* соответствует:

mv files* $something_that_does_not_exist

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

0 голосов
/ 01 мая 2009

Вы не сможете вернуть ваши файлы, так как оболочка расширит ваши файлы, и я считаю, что последний файл в списке теперь будет называться $thing_that_does_not_exist.

Все остальные ваши файлы в списке будут перезаписаны. Таким образом, вы не можете получить их обратно.

РЕДАКТИРОВАТЬ: На моей гладкой стене виртуальной машины (единственная GNU / Linux у меня прямо сейчас!) Я получаю это:

$ mkdir t1
$ mv t1 t2
$ ls
t2/
$ mv t2 t1
$ cd t1
$ touch f1 f2 f3 f4
$ mv f* ../t2
mv: target `../t2' is not a directory
...