{"id":19495808,"url":"https://github.com/aegoroff/copyto","last_synced_at":"2026-05-28T16:31:28.442Z","repository":{"id":37500237,"uuid":"153658101","full_name":"aegoroff/copyto","owner":"aegoroff","description":"copyto is a small command line app written in Go that allows you to easily one way sync between folders","archived":false,"fork":false,"pushed_at":"2026-02-04T06:32:04.000Z","size":406,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-04T07:43:10.782Z","etag":null,"topics":["golang","golang-application","tool"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aegoroff.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2018-10-18T16:57:59.000Z","updated_at":"2026-02-04T06:32:07.000Z","dependencies_parsed_at":"2023-11-28T19:27:42.326Z","dependency_job_id":"457a6718-ac37-4b39-844a-2e0697d15351","html_url":"https://github.com/aegoroff/copyto","commit_stats":null,"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/aegoroff/copyto","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aegoroff%2Fcopyto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aegoroff%2Fcopyto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aegoroff%2Fcopyto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aegoroff%2Fcopyto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aegoroff","download_url":"https://codeload.github.com/aegoroff/copyto/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aegoroff%2Fcopyto/sbom","scorecard":{"id":168714,"data":{"date":"2025-08-11","repo":{"name":"github.com/aegoroff/copyto","commit":"cc17b6325a1caedb8b4e71c9705a3b19aa020abc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:53: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/release.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/aegoroff/copyto/release.yml/master?enable=pin","Warn: goCommand not pinned by hash: .github/workflows/ci.yml:36","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.txt:0","Info: FSF or OSI recognized license: MIT License: LICENSE.txt:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":8,"reason":"5 out of the last 5 releases have a total of 5 signed artifacts.","details":["Info: signed release artifact: checksums.txt.sig: https://github.com/aegoroff/copyto/releases/tag/v1.3.0","Info: signed release artifact: checksums.txt.sig: https://github.com/aegoroff/copyto/releases/tag/v1.2.10","Info: signed release artifact: checksums.txt.sig: https://github.com/aegoroff/copyto/releases/tag/v1.2.9","Info: signed release artifact: checksums.txt.sig: https://github.com/aegoroff/copyto/releases/tag/v1.2.8","Info: signed release artifact: checksums.txt.sig: https://github.com/aegoroff/copyto/releases/tag/v1.2.7","Warn: release artifact v1.3.0 does not have provenance: https://api.github.com/repos/aegoroff/copyto/releases/152285605","Warn: release artifact v1.2.10 does not have provenance: https://api.github.com/repos/aegoroff/copyto/releases/122320770","Warn: release artifact v1.2.9 does not have provenance: https://api.github.com/repos/aegoroff/copyto/releases/91288645","Warn: release artifact v1.2.8 does not have provenance: https://api.github.com/repos/aegoroff/copyto/releases/79679676","Warn: release artifact v1.2.7 does not have provenance: https://api.github.com/repos/aegoroff/copyto/releases/62535290"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":7,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 0 commits out of 20 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T15:45:18.290Z","repository_id":37500237,"created_at":"2025-08-16T15:45:18.290Z","updated_at":"2025-08-16T15:45:18.290Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33617718,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","golang-application","tool"],"created_at":"2024-11-10T21:39:04.646Z","updated_at":"2026-05-28T16:31:28.426Z","avatar_url":"https://github.com/aegoroff.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# copyto\n\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/63fe9df66b8044c1a8360ce1d830b610)](https://app.codacy.com/gh/aegoroff/copyto/dashboard?utm_source=gh\u0026utm_medium=referral\u0026utm_content=\u0026utm_campaign=Badge_grade)\n[![CI](https://github.com/aegoroff/copyto/actions/workflows/ci.yml/badge.svg)](https://github.com/aegoroff/copyto/actions/workflows/ci.yml) [![codecov](https://codecov.io/gh/aegoroff/copyto/branch/master/graph/badge.svg)](https://codecov.io/gh/aegoroff/copyto) [![Go Report Card](https://goreportcard.com/badge/github.com/aegoroff/copyto)](https://goreportcard.com/report/github.com/aegoroff/copyto)\n\n**copyto** is a small command line app written in Go that allows you to easily one way\nsync files between source folder and target folder. i.e. all files from source that\nmatches (by relative path) corresponding files in target folder will be copied from source folder to\ntarget one.\n\nThe app supports setting source and target paths directly from command line and configuration file\nin TOML format also can be used. Using configuration file you can setup several sources and targets.\n\nAlso you can setup file names filter using include or exclude options (or both) using either configuration\nfile or command line. Include filter allows only file matched to be copied. Exclude filter allows all files but\nthose that matched to be copied.\n\n## Install the pre-compiled binary\n\n**homebrew** (only on macOS and Linux for now):\n\nAdd my tap (do it once):\n\n```sh\nbrew tap aegoroff/tap\n```\n\nAnd then install copyto:\n\n```sh\nbrew install copyto\n```\n\nUpdate copyto if already installed:\n\n```sh\nbrew upgrade copyto\n```\n\n**scoop**:\n\n```sh\nscoop bucket add aegoroff https://github.com/aegoroff/scoop-bucket.git\nscoop install copyto\n```\n\n**AUR (Arch Linux User Repository)**:\n\ninstall binary package:\n\n```sh\n yay -S copyto-go-bin\n```\n\nor if yay reports that package not found force updating repo info\n\n```sh\nyay -Syyu copyto-go-bin\n```\n\n**manually**:\n\nDownload the pre-compiled binaries from the [releases](https://github.com/aegoroff/copyto/releases) and\ncopy to the desired location.\n\n## Command line syntax:\n\n```\nUsage:\n  copyto [flags]\n  copyto [command]\n\nAvailable Commands:\n  cmdline     Use command line to configure required application parameters\n  config      Use TOML configuration file to configure required application parameters\n  help        Help about any command\n  version     Print the version number of copyto\n\nFlags:\n  -h, --help      help for copyto\n  -v, --verbose   Verbose output\n\nUse \"copyto [command] --help\" for more information about a command.\n```\n\nCommand line mode syntax:\n\n```\nUse command line to configure required application parameters\n\nUsage:\n  copyto cmdline [flags]\n\nAliases:\n  cmdline, cmd, l\n\nFlags:\n  -e, --exclude string   Exclude files whose names match pattern specified by the option\n  -h, --help             help for cmdline\n  -i, --include string   Include only files whose names match the pattern specified by the option\n  -s, --source string    Path to the source folder, to copy (sync) data from (required)\n  -t, --target string    Path to the target folder, to copy (sync) data to (required)\n\nGlobal Flags:\n  -v, --verbose   Verbose output\n```\n\nConfig file mode syntax:\n\n```\nUse TOML configuration file to configure required application parameters\n\nUsage:\n  copyto config [flags]\n\nAliases:\n  config, conf, c\n\nFlags:\n  -h, --help          help for config\n  -p, --path string   Path to configuration file (required)\n\nGlobal Flags:\n  -v, --verbose   Verbose output\n```\n\n## Examples:\n\nLet's do one way sync files between folder _D:\\fSource_ and _D:\\fTarget_. Source folder content:\n\n```\nsub\n  |- f3.pub\nf1.docx\nf2.pptx\nf4.rar\n```\n\nTarget folder content:\n\n```\nsub\n  |- f3.pub\nf1.docx\nf2.pptx\nf5.xlsx\n```\n\nSo we use command line to run syncing:\n\n```\ncopyto cmdline -s D:\\fSource -t D:\\fTarget\n```\n\nIt will copy 3 files from _D:\\fSource_ to _D:\\fTarget_ and says that _f5.xlsx_ not found in the source folder.\nFile _f4.rar_ will not be copied because it is not exists in the target folder:\n\n```\n   Found files that present in target but missing in source:\n     \\f5.xlsx\n\n   Total copied:                              3\n   Copy errors:                               0\n   Present in target but not found in source: 1\n```\n\nNow let's do the same task using config file. Create text file in UTF-8 encoding with the content like this:\n\n```\n# Example copyto config\n\ntitle = \"Exaample sync\"\n\n[sources]\n [sources.src1]\n  source = 'D:\\fSource'\n\n[definitions]\n\n  [definitions.def1]\n  sourcelink = \"src1\"\n  target = 'D:\\fTarget'\n\n  [definitions.def2]\n  source = 'D:\\fSource1'\n  target = 'D:\\fTarget2'\n```\n\n**IMPORTANT:** So as not to write double back slashes on Windows use string in '(apos) instead of \"(quote).\n\n**IMPORTANT:** All keys must be in lower case\n\nYou can use one source for several definitions using it's key (string after dot in square brackets) as value\nof _sourceLink_ option. If both _source_ and _sourceLink_ defined in the\nsame definition _source_ option wins.\n\nAnd then use it using config verb:\n\n```\ncopyto config -p D:\\example.toml\n```\n\nThe app will do sync and shows output like this:\n\n```\n Section: def1\n Source: D:\\fSource\n Target: D:\\fTarget\n   Found files that present in target but missing in source:\n     \\f5.xlsx\n\n   Total copied:                              3\n   Copy errors:                               0\n   Present in target but not found in source: 1\n\n Section: def2\n Source: D:\\fSource1\n Target: D:\\fTarget2\n\n   Total copied:                              0\n   Copy errors:                               0\n   Present in target but not found in source: 0\n```\n\nFiltering config example:\n\n```\n# Example copyto config\n\ntitle = \"Exaample sync\"\n\n[sources]\n [sources.src1]\n  source = 'D:\\fSource'\n\n[definitions]\n\n  [definitions.def1]\n  sourcelink = \"src1\"\n  target = 'D:\\fTarget'\n  exclude = '*.exe'\n\n  [definitions.def2]\n  source = 'D:\\fSource1'\n  target = 'D:\\fTarget2'\n  include = '*.txt'\n\n  [definitions.def3]\n  source = 'D:\\fSource3'\n  target = 'D:\\fTarget4'\n  include = '*.txt'\n  exclude = 'bad*.txt'\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faegoroff%2Fcopyto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faegoroff%2Fcopyto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faegoroff%2Fcopyto/lists"}