用于创建文件夹和移动文件的 bash 别名

用于创建文件夹和移动文件的 bash 别名

我正在尝试创建一个 bash 别名来执行以下操作:

  1. 创建一个文件夹(以当前日期作为文件夹名称)
  2. 将文件从当前文件夹移动(或复制,对我来说都可以)到新文件夹中。

文件名作为变量传递给别名。例如,my-alias file.txt

以下是我尝试过的一些方法(尽管我尝试了更多的变体):

alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 './$(date +%F)-List/$1' && cd '$(date +%F)-List'"

alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 ./$(date +%F)-List/$1 && cd '$(date +%F)-List'"

alias my-alias="mkdir -v -p '$(date +%F)-List' && cd '$(date +%F)-List' && cp ../$1 ./$1"

我尝试了很多编写命令的方法,但都不起作用。

我在看什么?

这是在 Mac 操作系统上,应该与大多数其他 Linux 环境相同。

更新:我哪里出错了

我已经意识到我在哪里感到困惑了。我设置了很多别名“似乎”来接收参数。我很久以前(几年前)就设置了它们。我现在意识到别名似乎只接收参数,因为别名可以处理在命令行输入时跟随的任何内容。但它只会处理那些位于别名引用的命令字符串末尾且顺序相同的“参数”。因此,一旦我开始尝试在别名命令字符串中调整参数,别名就会中断。所以是的,最好的方法是使用函数。

答案1

如果必须使用别名,可以使用 -t 在要移动的文件的实际参数之前指定目标目录:

alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"

可以在 Linux 上运行,但我没有 MacOS 机器来测试。

答案2

使用函数而不是别名。如果您在使用别名时遇到问题,这几乎总是答案。特别是如果您尝试使用参数(例如$1),因为别名实际上并不接受参数。

另外,您几乎应该始终在参数和变量引用周围加上双引号(即"$1"而不只是$1)。并且不要运行date多次,因为有可能(如果不太可能)您会得到不同的结果;运行一次并将结果存储在变量中。尝试这个:

my-function() {
    local subdir="$(date +%F)-List"
    mkdir -v -p "$subdir" &&
        cp "$1" "$subdir/$1" &&
        cd "$subdir"
}

答案3

正如其他问题的答案所示:别名不擅长处理参数。你甚至可以看到:

param=foo; do something with "$param"

这就是参数的工作原理:首先(在时间和命令行中)设置它们,然后使用它们。与此相反:

<alias string with several commands to be expanded> <parameter>

该参数可以是别名中最后一个命令的参数。那不是你需要的。

您可以通过从 shell 的角度将别名构建为单个命令来使用别名来完成此操作,但这是否是一种有用的方法是值得怀疑的:

alias testalias='bash -c "echo \$1; echo \$1-" bash'
$ testalias foo
foo
foo-

反对它的一个论点是引用很复杂。就连我也先犯了这个错误。

答案4

您需要创建一个函数。mkdir -v -p '$(date +%F)-List'仅在创建别名时进行评估

相关内容