Вы получаете четыре строки вывода, потому что вы просите find
выполнить поиск в текущем каталоге (.
), а также во всем, до чего расширяется *
.
Для текущего каталога find
продолжит вызывать ll
для вещей, которые он находит, которые будут текущим каталогом, каталогом test
и файлом в каталоге test
. В этом списке file123
дважды.
Затем он будет искать все, что расширяется *
, что будет каталогом test
. Теперь он снова будет использовать ll
для test
и для файла внутри. Это снова перечисляет ваш файл дважды.
Вместо этого, если вы ищете обычный файл, используйте -type f
. И вам не нужно использоватьll
(или ls
), чтобы получить результаты из find
, так как по умолчанию будут перечислены найденные пути. Кроме того, просто укажите find
текущий каталог (илиtest
)в качестве пути поиска :
find. -type f
Если вы знаете, что ищете файл с точным именемfile123
:
find. -type f -name 'file123'
Если вы хотитеls -l
-как вывод, а не путь:
find. -type f -name 'file123' -ls
Ваша команда,
find. -name "*.txt" -exec cp {} fruit.txt \;
будет правильно находить все файлы (и каталоги и т. д. ), которые имеют суффикс имени файла .txt
в текущем каталоге или ниже, и будет копировать их все, один за другим, в имя fruit.txt
в текущем каталоге .
Что вам нужно сделать, так это скопировать их в тот же каталог, что и исходный файл, и, возможно, рассматривать только обычные файлы, а также избегать уже существующих fruit.txt
имен:
find. -type f -name '*.txt' ! -name fruit.txt -execdir cp -- {} fruit.txt \;
Когда вы используете не -стандартный (, но общедоступный предикат )-execdir
, используемая вами команда будет выполняться внутри каталога найденного файла. Это означает, что указанный выше cp
скопирует файл в fruit.txt
в тот же каталог, что и найденный файл.
В зависимости от желаемого эффекта вы можете использовать символическую ссылку вместо копии файла:
find. -type f -name '*.txt' ! -name fruit.txt -execdir ln -sf -- {} fruit.txt \;