cp
действительно нет возможности получать только файлы, но, как сказал Берсерк , вы можете использовать find
вместе с cp
. На самом деле, это действительно просто:
# Copy only files
find /path/to/file -type f -execdir cp "{}" /dest/path ";"
Или же:
# Copy everything except directories
find /path/to/file -not -type d -execdir cp "{}" /dest/path ";"
объяснение
find
- это инструмент, который будет искать нужные вам файлы. В первом варианте мы устанавливаем -type f
чтобы возвращать только обычные файлы. Во втором варианте мы устанавливаем -not -type d
чтобы получить все, кроме каталогов. find
выполняет аргументы, переданные в -execdir
заменяя {}
на одну запись результата за раз, и останавливает команду когда ;
найден (;
должен быть экранирован \;
или ";"
, или оболочка может его развернуть).
-execdir
запустит команду, имеющую папку файла в качестве "рабочего каталога", и это предпочтительно вместо -exec
, проверьте ниже.
Документация опций -type
:
тип с
Файл имеет тип c:
b: блок (буферизованный) специальный
c: символ (небуферизованный) специальный
d: каталог
p: именованная труба (FIFO)
f: обычный файл
l: символическая ссылка; это никогда не верно, если действует опция -L или опция -follow, если только символическая ссылка не нарушена. Если вы хотите искать символические ссылки, когда действует -L, используйте -xtype.
s: гнездо
D: дверь (солярис)
Документация опции -not
:
! выраж
Истинно, если expr ложно. Этот персонаж также обычно нуждается в защите от интерпретации оболочкой.
-не expr
Такой же как ! expr, но не POSIX-совместимый.
Документация по опции -execdir
:
-exec команда;
Выполнить команду; true, если возвращается 0 статус. Все последующие аргументы для поиска считаются аргументами команды до аргумента, состоящего из ';' встречается. Строка '{}' заменяется текущим именем файла, обрабатываемым везде, где оно встречается в аргументах команды [...]. Обе эти конструкции, возможно, должны быть экранированы (с '\') или заключены в кавычки, чтобы защитить их от расширения оболочкой. Указанная команда запускается один раз для каждого соответствующего файла. Команда выполняется в начальном каталоге. Существуют неизбежные проблемы с безопасностью, связанные с использованием действия -exec; Вместо этого вы должны использовать опцию -execdir.
-execdir команда;
Аналогично -exec, но указанная команда запускается из подкаталога, содержащего соответствующий файл, который обычно не является каталогом, в котором вы начали поиск. Это гораздо более безопасный метод для вызова команд, поскольку он позволяет избежать условий гонки во время разрешения путей к соответствующим файлам. [...] Если вы используете эту опцию, вы должны убедиться, что переменная окружения $ PATH не ссылается на '.'; в противном случае злоумышленник может выполнить любые команды, которые ему нравятся, оставив файл с соответствующим именем в каталоге, в котором вы запустите -execdir. То же самое относится к наличию записей в $ PATH, которые являются пустыми или не являются абсолютными именами каталогов.
https://linux.die.net/man/1/find