Это не имеет никакого отношения к набору символов. Скорее это - язык, который определяет порядок сопоставления. libc исследует язык, представленный в $LC_COLLATE
/$LC_ALL
/$LANG
и ищет его правила сопоставления (например. /usr/share/i18n/locales/*
для GLibC) и заказы текст, как направлено.
Вы могли также использовать rsync
для этого.
$ rsync -a --prune-empty-dirs --include '*/' --include '*.csv' --exclude '*' source/ target/
Если Вы хотите сохранить пустые каталоги от исходного дерева, пропустите --prune-empty-dirs
опция:
$ rsync -a --include '*/' --include '*.csv' --exclude '*' source/ target/
Если Вы не хотите символьных ссылок, дат модификации, полномочий файла, владельцы, и т.д. сохраненные, замените -a
с другой комбинацией -rlptgoD
. ;-)
Можно использовать, находят, и cpio в проходят через режим
find . -name '*.csv' | cpio -pdm /target
Это найдет все .csv файлы в текущем каталоге и ниже и скопирует их в цель/, в которой базировалось поддержание структуры каталогов .
.
Если Вы используете
find /path/to/files -name '*.csv' | cpio -pdm /target
это найдет весь файл в /path/to/files
и ниже и копируют их в /target/path/to/files
и ниже.
Принятие Вас хочет копировать эту структуру от ./source
кому: ./destination
:
cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)
Я готов считать это как одну строку, cd source
будучи встроенной оболочкой.
Есть ли любая причина, почему люди сопротивляются находке использования -exec
? Это очень удобно.
find . -name '*.csv' -exec cp --parents \{\} /target \;
Знайте свои инструменты.;-)
-execdir
более безопасно, чем -exec
, просто замена один с другим не сохраняет структуру папок, как предназначено. Хороший
– Simon 'Reinstate Monica' Shine
23.08.2016, 14:33
CAVEAT:[1187712] Здесь я использую рекурсивный глобус; это опция [1187713]globstar[1187714] в Bash 4+ и [1187715]ksh[1187716], и поддерживается по умолчанию в [1187717]zsh[1187718]. Рекурсивные глобусы [1187719] не[1187720] соответствуют скрытым файлам и папкам, а некоторые реализации [1187721] следуют по симлинкам, в то время как другие не[1187722].
Если ваша оболочка не поддерживает рекурсивные глобусы, или если вы предпочитаете не использовать их, вы можете сделать следующее:
*. csv */*.csv */*/*.csv */*/*/*.csv[1187910] -- это, конечно, очень избыточно и требует знания глубины структуры вашего каталога.
$(find . -name '*.csv')[1187912] -- Эта [1187913]будет[1187914] соответствовать скрытым файлам и папкам. [1187915]find[1187916] также поддерживает указание, следуют ли симлинки, что может быть полезно.
Из справочной страницы rsync
:
-R, --relative
Использовать относительные пути. Это означает, что на сервер отправляются полные имена путей, указанные в командной строке, а не только последние части имен файлов. Это особенно полезно, когда вы хотите отправить несколько разных каталогов одновременно. Например, если вы использовали эту команду:
rsync -av /foo/bar/baz.c remote: / tmp /
... это создаст файл с именем baz.c в / tmp / на удаленном компьютере . Если вместо этого вы использовали
rsync -avR /foo/bar/baz.c remote: / tmp /
, то файл с именем /tmp/foo/bar/baz.c был бы создан на удаленная машина, сохраняя свой полный путь. Эти дополнительные элементы пути называются "подразумеваемыми каталогами" (т.е. каталогами "foo" и "foo / bar" в приведенном выше примере).
Таким образом, это тоже сработает:
rsync -armR --include="*/" --include="*.csv" --exclude="*" /full/path/to/source/file(s) destination/
У меня сработало:
find -name "* .csv" | xargs cp --parents -t / target
Если у вас есть имена файлов с пробелами, добавьте параметры -print0
и -0
, как предложено в одном из комментариев:
find -name "* .csv" -print0 | xargs -0 cp --parents -t / target
-m
ярлык для--prune-emty-dirs
. – Geremia 24.09.2016, 03:59-R
опция может быть добавлена для копирования структуры родительского каталога источника. (cf. мой ответ здесь.) – Geremia 24.09.2016, 04:52