3

Использование cp для копирования файлов из каталога, в котором также есть пустой каталог, приводит к возвращаемому значению ошибки, что не соответствует моему сценарию.

Есть ли способ просто пропустить каталоги, не возвращая ошибку? Я хотел бы, чтобы значение ошибки отражало любые ошибки, но наличие там пустой директории должно быть просто пропущено, а не сообщаться как ошибка.

Я мог бы просто добавить рекурсивную -r флага , но что , если я просто не хочу , каталог должны быть скопирован, но я хочу , чтобы какая - либо ошибка сообщать?

2 ответа2

2

Я предлагаю вам использовать rsync вместо cp, если у вас есть опция -m, которая исключает пустые папки, например:

rsync -am <origin> <destination>

Объяснение команды на поясняется

Я использую опцию -a, потому что она выполняет много приятных действий по умолчанию, но если вы хотите, вы также можете использовать опцию -r, которая установит только рекурсивный режим.

[Добавить комментарий]

Я не знаю, как это сделать с помощью cp, по крайней мере, на странице руководства не показано ни одной опции, которая сделает это за вас. Вероятно, вы можете сделать более сложное решение, используя команду find чтобы найти список файлов / каталогов для копирования, а затем передать его в cp, но это будет намного сложнее, чем rsync. rsync даже довольно стандартен во многих linux

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .