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