正确引用bash别名定义

正确引用bash别名定义,bash,alias,Bash,Alias,我尝试将以下命令放入bash别名中。命令本身工作正常,但当我尝试将其别名时,会出现以下错误: 命令 find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr 别名 alias csfiles='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type

我尝试将以下命令放入bash别名中。命令本身工作正常,但当我尝试将其别名时,会出现以下错误:

命令

find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr
别名

alias csfiles='find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo "$(find "{}" -type f | wc -l)" {}' \; | sort -nr'
错误:

-sh: alias 0: not found
-sh: alias {} \; | sort nr: not found

我想这意味着我没有正确使用引号,但我在确定正确的组合时遇到了困难。帮助?

您可以在定义周围使用双引号,如下所示:

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo \"\$(find \"{}\" -type f | wc -l)\" {}' \; | sort -nr"
定义中的每个文字都会转义:\

注意:您还需要退出内部命令替换,以防止它在别名定义时被扩展。像这样…\$

作为chepners注释的后续操作,应该将文件名作为参数传递给内部find命令。否则,如果您的某个文件夹的名称中包含以下内容,您将遇到问题:


可以在定义周围使用双引号,如下所示:

alias foo="find . -maxdepth 1 -mindepth 1 -type d -exec sh -c 'echo \"\$(find \"{}\" -type f | wc -l)\" {}' \; | sort -nr"
定义中的每个文字都会转义:\

注意:您还需要退出内部命令替换,以防止它在别名定义时被扩展。像这样…\$

作为chepners注释的后续操作,应该将文件名作为参数传递给内部find命令。否则,如果您的某个文件夹的名称中包含以下内容,您将遇到问题:

你的外部发现没有做任何你不能用一个简单的地球仪做的事情。这消除了为每个找到的目录添加一层引号和sh进程

# Ignoring the issue of assuming no file name contains a newline
for d in ./*/; do
   echo "$(find "$d" -type f | wc -l) $d"
done
只需定义一个shell函数,以消除施加在alias参数上的第二层

对find的其余调用也可以替换为for循环,从而消除了每个文件名一行的假设:

csfiles () {
  for d in ./*/; do
    echo "$(for f in "$d"/*; do [ -f "$f" ] && echo; done | wc -l) $d"
  done
}
您可以继续查找它是否支持-printfprimary,因为您不关心文件的实际名称,只关心每个文件只得到一行输出

csfiles () {
  for d in ./*/; do
    echo "$(find "$d" -type f -printf . | wc -l) $d"
  done
}
你的外部发现没有做任何你不能用一个简单的地球仪做的事情。这消除了为每个找到的目录添加一层引号和sh进程

# Ignoring the issue of assuming no file name contains a newline
for d in ./*/; do
   echo "$(find "$d" -type f | wc -l) $d"
done
只需定义一个shell函数,以消除施加在alias参数上的第二层

对find的其余调用也可以替换为for循环,从而消除了每个文件名一行的假设:

csfiles () {
  for d in ./*/; do
    echo "$(for f in "$d"/*; do [ -f "$f" ] && echo; done | wc -l) $d"
  done
}
您可以继续查找它是否支持-printfprimary,因为您不关心文件的实际名称,只关心每个文件只得到一行输出

csfiles () {
  for d in ./*/; do
    echo "$(find "$d" -type f -printf . | wc -l) $d"
  done
}

我已经有一段时间没有使用别名了,但我觉得你的别名太复杂了。我相信alias只是用来缩短一个带参数的命令,即alias l='ls-al'。您可能需要创建一个函数csfiles。但这已经有一段时间了,所以我可能弄错了。请看我第二次创建bash函数来实现这一点。您可以用同样的方式调用它,其好处是可以在需要时传递参数。正如所写的那样,find命令对于某些文件名(例如包含双引号的文件名)将失败。不要试图在命令中嵌入{};仅将其用作sh.sh-c'..'{}的参数。无论在哪里使用{},都要使用$1。@chepner这是一个很好的观点!我已经有一段时间没有使用别名了,但我觉得你的别名太复杂了。我相信alias只是用来缩短一个带参数的命令,即alias l='ls-al'。您可能需要创建一个函数csfiles。但这已经有一段时间了,所以我可能弄错了。请看我第二次创建bash函数来实现这一点。您可以用同样的方式调用它,其好处是可以在需要时传递参数。正如所写的那样,find命令对于某些文件名(例如包含双引号的文件名)将失败。不要试图在命令中嵌入{};仅将其用作sh.sh-c'..'{}的参数。无论在哪里使用{},都要使用$1。@chepner这是一个很好的观点!