Случайное перемещение файлов и папок в несуществующие места

StackOverflow https://stackoverflow.com/questions/809761

  •  03-07-2019
  •  | 
  •  

Вопрос

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

mv folder $something_that_does_not_exist
mv files* $something_that_does_not_exist

Затем я понимаю, что мои файлы пропали.Я не вижу их даже в папке «$something_that_does_not_exist».Куда пропали мои файлы и папки?Как я могу получить их обратно?

Это было полезно?

Решение

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

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

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

Другие советы

Если $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 не установлен, последующие команды выполняться не будут.

Вы не сможете вернуть свои файлы, так как оболочка расширит ваши файлы, и я полагаю, что последний файл в списке теперь будет называться $something_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
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

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

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

mv folder abcde

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

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

mv files* abcde

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top