Перезапись данных
8.3.2 Избегайте перезапись данных
Команда cp
может разрушить существующие данные, если целевой файл уже существует. В случае, когда целевой файл существует, cp
команда перезаписывает содержимое существующего файла содержимым исходного файла.
Чтобы проиллюстрировать эту потенциальную проблему, сначала создается новый файл в домашнем каталоге путем копирования существующего файла:
sysadmin@localhost:~$ cp /etc/hostname example.txt
Посмотреть информацию о файле командой ls
:
sysadmin@localhost:~$ ls -l example.txt
-rw-r--r-- 1 sysadmin sysadmin 10 Dec 15 22:55 example.txt
Просмотрите содержимое файла с помощью cat
команды:
sysadmin@localhost:~$ cat example.txt
localhost
В следующем примере cp
команда уничтожает исходное содержимое файла example.txt
:
sysadmin@localhost:~$ cp /etc/timezone example.txt
Обратите внимание, что после cp
выполнения команды размер файла изменился, а содержимое стало другим:
sysadmin@localhost:~$ ls -l example.txt
-rw-r--r-- 1 sysadmin sysadmin 8 Dec 15 22:58 example.txt
sysadmin@localhost:~$ cat example.txt
Etc/UTC
Для защиты от случайной перезаписи можно использовать два варианта. С -i
интерактивной опцией cp
команда запрашивает пользователя перед перезаписью файла. Следующий пример демонстрирует этот вариант, сначала восстанавливая содержимое исходного файла:
sysadmin@localhost:~$ cp -i /etc/hosts example.txt
cp: overwrite `/home/sysadmin/example.txt'? n
Если бы было задано значение y
(да), то процесс копирования имел бы место. n
Однако при запросе на перезапись файла было задано значение (нет), поэтому в файл не было внесено никаких изменений.
Опция -i
требует, чтобы вы ответили y
или n
для каждой копии, которая может в конечном итоге перезаписать содержимое существующего файла. Это может быть утомительно, когда происходит множество перезаписей, как в примере, показанном ниже:
sysadmin@localhost:~$ cp -i /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; omitting directory '/etc/skel/..'
cp: overwrite `/home/sysadmin/.bash_logout'? n
cp: overwrite `/home/sysadmin/.bashrc'? n
cp: overwrite `/home/sysadmin/.profile'? n
cp: overwrite `/home/sysadmin/.selected_editor'? n
Как видно из приведенного выше примера, cp
команда попыталась перезаписать четыре существующих файла, заставив пользователя ответить на четыре подсказки. Если бы эта ситуация произошла для 100 файлов, это могло бы стать очень раздражающим, очень быстро.
Чтобы отвечать n
на каждое приглашение автоматически, используйте -n
параметр. Это означает отсутствие затирания или перезаписывания .
sysadmin@localhost:~$ cp -n /etc/skel/.* ~
cp: -r not specified; omitting directory '/etc/skel/.'
cp: -r not specified; omitting directory '/etc/skel/..'
Last updated