Скопируйте определенный тип файла, сохраняющий структуру папок

Это не имеет никакого отношения к набору символов. Скорее это - язык, который определяет порядок сопоставления. libc исследует язык, представленный в $LC_COLLATE/$LC_ALL/$LANG и ищет его правила сопоставления (например. /usr/share/i18n/locales/* для GLibC) и заказы текст, как направлено.

120
18.11.2014, 20:11
7 ответов

Вы могли также использовать 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. ;-)

49
27.01.2020, 19:29
  • 1
    -m ярлык для --prune-emty-dirs. –  Geremia 24.09.2016, 03:59
  • 2
    кроме того, -R опция может быть добавлена для копирования структуры родительского каталога источника. (cf. мой ответ здесь.) –  Geremia 24.09.2016, 04:52

Можно использовать, находят, и cpio в проходят через режим

find . -name '*.csv' | cpio -pdm  /target

Это найдет все .csv файлы в текущем каталоге и ниже и скопирует их в цель/, в которой базировалось поддержание структуры каталогов ..

Если Вы используете

find /path/to/files -name '*.csv' | cpio -pdm /target

это найдет весь файл в /path/to/files и ниже и копируют их в /target/path/to/files и ниже.

33
27.01.2020, 19:29
  • 1
    я попробовал всю верхнюю часть ответов вниз до этого, и это было единственным, которое работало над первым –  OscarRyz 24.06.2016, 22:10

Принятие Вас хочет копировать эту структуру от ./source кому: ./destination:

cd source
find . -name "*.csv" | xargs tar cvf - | (cd ../destination ; tar xfp -)

Я готов считать это как одну строку, cd source будучи встроенной оболочкой.

8
27.01.2020, 19:29
  • 1
    я не думаю он действительно, означает одну команду - просто не имеющий необходимость утомить о подобном его пример ;) –   18.07.2013, 18:04
  • 2
    tar имеет -C опция избежать необходимости изменять каталог сначала. –  bart 04.11.2016, 13:54

Есть ли любая причина, почему люди сопротивляются находке использования -exec? Это очень удобно.

find . -name '*.csv' -exec cp --parents \{\} /target \;

Знайте свои инструменты.;-)

143
27.01.2020, 19:29
  • 1
    Вероятно, из-за этого \{\\} \; –  igo 04.03.2015, 15:56
  • 2
    '{}' работы точно также –  OrangeDog 07.12.2015, 19:44
  • 3
    Даже при том, что -execdir более безопасно, чем -exec, просто замена один с другим не сохраняет структуру папок, как предназначено. Хороший –  Simon 'Reinstate Monica' Shine 23.08.2016, 14:33
  • 4
    Почему я получаю сообщение 'Каталог Omitting', когда я пытаюсь скопировать их с Вашей командой? –  Vicky Dev 06.09.2016, 10:32
  • 5
    Можно ли объяснить, почему фигурных скобок нужно оставить здесь? –  Noumenon 23.10.2016, 06:26
[1187309]Команда [1187709]cp[1187710] разрешает использовать несколько аргументов источника:

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] также поддерживает указание, следуют ли симлинки, что может быть полезно.

23
27.01.2020, 19:29

Из справочной страницы 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/
11
20.08.2021, 13:09

У меня сработало:

find -name "* .csv" | xargs cp --parents -t / target

Если у вас есть имена файлов с пробелами, добавьте параметры -print0 и -0 , как предложено в одном из комментариев:

find -name "* .csv" -print0 | xargs -0 cp --parents -t / target

24
20.08.2021, 13:09

Теги

Похожие вопросы