2022-08-28 13:21:57 +02:00
|
|
|
// Package cat provides the cat command.
|
2016-08-18 23:43:02 +02:00
|
|
|
package cat
|
|
|
|
|
|
|
|
import (
|
2019-06-17 10:34:30 +02:00
|
|
|
"context"
|
2017-02-08 09:09:41 +01:00
|
|
|
"io"
|
|
|
|
"io/ioutil"
|
|
|
|
"log"
|
2016-08-18 23:43:02 +02:00
|
|
|
"os"
|
2020-05-25 09:50:20 +02:00
|
|
|
"strings"
|
2016-08-18 23:43:02 +02:00
|
|
|
|
2019-07-28 19:47:38 +02:00
|
|
|
"github.com/rclone/rclone/cmd"
|
2019-10-11 17:55:04 +02:00
|
|
|
"github.com/rclone/rclone/fs/config/flags"
|
2019-07-28 19:47:38 +02:00
|
|
|
"github.com/rclone/rclone/fs/operations"
|
2016-08-18 23:43:02 +02:00
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
2017-02-08 09:09:41 +01:00
|
|
|
// Globals
|
|
|
|
var (
|
|
|
|
head = int64(0)
|
|
|
|
tail = int64(0)
|
|
|
|
offset = int64(0)
|
|
|
|
count = int64(-1)
|
|
|
|
discard = false
|
|
|
|
)
|
|
|
|
|
2016-08-18 23:43:02 +02:00
|
|
|
func init() {
|
2019-10-11 17:58:11 +02:00
|
|
|
cmd.Root.AddCommand(commandDefinition)
|
2019-10-11 17:55:04 +02:00
|
|
|
cmdFlags := commandDefinition.Flags()
|
2021-08-16 11:30:01 +02:00
|
|
|
flags.Int64VarP(cmdFlags, &head, "head", "", head, "Only print the first N characters")
|
|
|
|
flags.Int64VarP(cmdFlags, &tail, "tail", "", tail, "Only print the last N characters")
|
|
|
|
flags.Int64VarP(cmdFlags, &offset, "offset", "", offset, "Start printing at offset N (or from end if -ve)")
|
|
|
|
flags.Int64VarP(cmdFlags, &count, "count", "", count, "Only print N characters")
|
|
|
|
flags.BoolVarP(cmdFlags, &discard, "discard", "", discard, "Discard the output instead of printing")
|
2016-08-18 23:43:02 +02:00
|
|
|
}
|
|
|
|
|
2019-10-11 17:58:11 +02:00
|
|
|
var commandDefinition = &cobra.Command{
|
2016-08-18 23:43:02 +02:00
|
|
|
Use: "cat remote:path",
|
|
|
|
Short: `Concatenates any files and sends them to stdout.`,
|
2020-05-25 09:50:20 +02:00
|
|
|
// Warning! "|" will be replaced by backticks below
|
|
|
|
Long: strings.ReplaceAll(`
|
2016-08-18 23:43:02 +02:00
|
|
|
rclone cat sends any files to standard output.
|
|
|
|
|
|
|
|
You can use it like this to output a single file
|
|
|
|
|
|
|
|
rclone cat remote:path/to/file
|
|
|
|
|
2020-02-10 16:07:40 +01:00
|
|
|
Or like this to output any file in dir or its subdirectories.
|
2016-08-18 23:43:02 +02:00
|
|
|
|
|
|
|
rclone cat remote:path/to/dir
|
|
|
|
|
2020-02-10 16:07:40 +01:00
|
|
|
Or like this to output any .txt files in dir or its subdirectories.
|
2016-08-18 23:43:02 +02:00
|
|
|
|
|
|
|
rclone --include "*.txt" cat remote:path/to/dir
|
2017-02-08 09:09:41 +01:00
|
|
|
|
2020-05-25 09:50:20 +02:00
|
|
|
Use the |--head| flag to print characters only at the start, |--tail| for
|
|
|
|
the end and |--offset| and |--count| to print a section in the middle.
|
2017-02-08 09:09:41 +01:00
|
|
|
Note that if offset is negative it will count from the end, so
|
2020-05-25 09:50:20 +02:00
|
|
|
|--offset -1 --count 1| is equivalent to |--tail 1|.
|
|
|
|
`, "|", "`"),
|
2016-08-18 23:43:02 +02:00
|
|
|
Run: func(command *cobra.Command, args []string) {
|
2017-02-08 09:09:41 +01:00
|
|
|
usedOffset := offset != 0 || count >= 0
|
|
|
|
usedHead := head > 0
|
|
|
|
usedTail := tail > 0
|
|
|
|
if usedHead && usedTail || usedHead && usedOffset || usedTail && usedOffset {
|
|
|
|
log.Fatalf("Can only use one of --head, --tail or --offset with --count")
|
|
|
|
}
|
|
|
|
if head > 0 {
|
|
|
|
offset = 0
|
|
|
|
count = head
|
|
|
|
}
|
|
|
|
if tail > 0 {
|
|
|
|
offset = -tail
|
|
|
|
count = -1
|
|
|
|
}
|
2016-08-18 23:43:02 +02:00
|
|
|
cmd.CheckArgs(1, 1, command, args)
|
|
|
|
fsrc := cmd.NewFsSrc(args)
|
2017-02-08 09:09:41 +01:00
|
|
|
var w io.Writer = os.Stdout
|
|
|
|
if discard {
|
|
|
|
w = ioutil.Discard
|
|
|
|
}
|
2016-12-04 17:52:24 +01:00
|
|
|
cmd.Run(false, false, command, func() error {
|
2019-06-17 10:34:30 +02:00
|
|
|
return operations.Cat(context.Background(), fsrc, w, offset, count)
|
2016-08-18 23:43:02 +02:00
|
|
|
})
|
|
|
|
},
|
|
|
|
}
|