Я пытаюсь узнать о команде 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/
Здесь вы можете увидеть следующую процедуру и структуру каталогов:
Ответ Анкида был принят, но в основном это неправильно. Да, поиск также выполняет поиск в каталоге 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 не жалуется, потому что файл (ы) назначения существует, но поскольку он (они) является именно исходным файлом. И это именно то, о чем говорится в сообщении об ошибке.
Это ошибка (код возврата 1), из cp:
>>> cp foo foo
cp: `foo' and `foo' are the same file
<<< 11:33.40 Sat Aug 04 2012!~
1
Это означает, что cp ничего не сделал.