cp: `./lcommands/cde.pdf 'и` lcommands / cde.pdf' - это тот же файл

Я пытаюсь узнать о команде find. Я хотел бы понять смысл этого предупреждения:

ankit@battlestar:/home/mount_150/studies$ find -iname "*.pdf" -exec cp -ar {} lcommands/  \;
cp: `./lcommands/june.pdf' and `lcommands/june.pdf' are the same file
cp: `./lcommands/cde.pdf' and `lcommands/cde.pdf' are the same file
cp: `./lcommands/abc.pdf' and `lcommands/abc.pdf' are the same file
ankit@battlestar:/home/mount_150/studies$ ls -l lcommands/

Здесь вы можете увидеть следующую процедуру и структуру каталогов:

1
задан 11 September 2017 в 13:27

2 ответа

Ответ Анкида был принят, но в основном это неправильно. Да, поиск также выполняет поиск в каталоге lcommands, но, как вы можете видеть из части скриншота перед поиском, каталог lcommands уже содержит три файла PDF, прежде чем команда find вышла.

Что действительно происходит: find -exec cp приводит к команде cp ./lcommands/abc.pdf lcommands/. Так как ./lcommands является именно каталогом lcommands (./ совпадает с ././, то же, что и ./././././, так же, как и каталог, в котором вы находитесь), это приведет к копированию abc.pdf который cp отказывается, поскольку это приведет к поврежденному файлу назначения (по крайней мере, для файлов, больших, чем буфер cp, длинный).

Представьте, как работает cp: он открывает исходный файл, читает фрагмент, открывает целевой файл (обрезает его, если он должен существовать и не быть пустым), записывает предыдущий фрагмент чтения в файл назначения; то он будет читать следующий фрагмент исходного файла, но все, кроме первого фрагмента, уходит из-за предыдущей операции усечения. Поэтому авторы cp старались обнаружить любую ситуацию, когда исходный и целевой файлы совпадают.

cp не жалуется, что файл уже существует - он бы с радостью перезаписал его! За исключением дополнительной опции -i или -n. Итак, ответ Ankid верен, даже если он может быть не очень подробным и не помог вам поэтому.

То же самое с двумя другими файлами PDF.

Чтобы сделать это как можно более ясным: cp не жалуется, потому что файл (ы) назначения существует, но поскольку он (они) является именно исходным файлом. И это именно то, о чем говорится в сообщении об ошибке.

2
ответ дан 25 May 2018 в 07:55
  • 1
    «Справочник lcommands уже содержит три файла PDF до того, как вышла команда find». Это произошло, но они были удалены позже. См. Команду rm на снимке экрана. Кроме того, ваш ответ правильный. – Melebius 11 September 2017 в 16:20

Это ошибка (код возврата 1), из cp:

>>> cp foo foo
cp: `foo' and `foo' are the same file
<<< 11:33.40 Sat Aug 04 2012!~ 
1

Это означает, что cp ничего не сделал.

1
ответ дан 25 May 2018 в 07:55
  • 1
    на самом деле cp скопировал файлы в lcommand папку; как вы могли видеть на снимке экрана. – Ankit 4 August 2012 в 14:37

Другие вопросы по тегам:

Похожие вопросы: