Перезапись данных

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