У меня есть структура папок с кучей * .csv файлов, разбросанных по папкам. Теперь я хочу скопировать все файлы * .csv в другое место, сохраняя структуру папок.
Это работает, делая:
cp --parents *.csv /target
cp --parents */*.csv" /target
cp --parents */*/*.csv /target
cp --parents */*/*/*.csv /target
...
и так далее, но я хотел бы сделать это с помощью одной команды.
'{}'
работает так же хорошо-execdir
это безопаснее, чем-exec
просто заменить одну на другую, структура папок не будет сохранена должным образом.Вы также можете использовать
rsync
для этого.Если вы хотите сохранить пустые каталоги из исходного дерева, пропустите
--prune-empty-dirs
параметр:Если вы не хотите сохранять символические ссылки, даты изменения, права доступа к файлам, владельцев и т. Д., Замените их
-a
на другую комбинацию-rlptgoD
. ;-)источник
-m
это ярлык для--prune-emty-dirs
.-R
можно добавить опцию для копирования структуры родительского каталога источника. (см. мой ответ здесь.)Вы можете использовать find и cpio в режиме сквозной передачи
Это найдет все файлы .csv в текущем каталоге и ниже и скопирует их в / target, поддерживая структуру каталога с корнем
.
.Если вы используете
он найдет все файлы в
/path/to/files
и ниже и скопирует их в/target/path/to/files
и ниже.источник
Команда
cp
разрешает множественные исходные аргументы:ПРЕДУПРЕЖДЕНИЕ: я использую рекурсивный шар здесь; это
globstar
опция в Bash 4+ksh
и поддерживается по умолчанию вzsh
. Рекурсивные глобусы не соответствуют скрытым файлам и папкам, и некоторые реализации следуют символическим ссылкам, а другие - нет .Если ваша оболочка не поддерживает рекурсивные глобусы или вы не хотите их использовать, вы можете сделать следующее:
*.csv */*.csv */*/*.csv */*/*/*.csv
- это, конечно, очень избыточно и требует знания глубины структуры вашего каталога.$(find . -name '*.csv')
- Это будет соответствовать скрытым файлам и папкам.find
также поддерживает указание, следует ли использовать символические ссылки, что может быть полезно.источник
shopt -s globstar
непосредственно перед моей командой, и все хорошо. Спасибо за продолжение!--parents
было то, что я искал. спасибоЭтот работал для меня:
find -name "*.csv" | xargs cp --parents -t /target
источник
find [things] | xargs [do stuff]
это очень мощный.find -print0
иxargs -0
.Предполагая, что вы хотите скопировать эту структуру из
./source
в./destination
:Я готов посчитать это одной строкой,
cd source
являющейся встроенной оболочкой.источник
tar
имеет-C
возможность избежать необходимости менять каталог в первую очередь.Из
rsync
справочной страницы:Так что это тоже подойдет:
источник