Shell脚本:更改文件夹名称中的工作目录和空格

时间:2012-01-27 21:33:30

标签: bash shell

我想创建一个脚本,它接受参数的文件路径,并将cds放入其文件夹中。 这就是我所做的:

#!/bin/bash

#remove the file name, and change every space into \space
shorter=`echo "$1" | sed 's/\/[^\/]*$//' | sed 's/\ /\\\ /g'`

echo $shorter
cd $shorter

我实际上有2个问题(我是shell脚本的相对新手):

  • 我怎么能让cd“持久”?我想将此脚本放入/ usr / bin,然后从文件系统中的任何位置调用它。返回脚本后,我想留在$shorter文件夹中。基本上,如果pwd是/ usr / bin,我可以通过键入. script /my/path而不是./script /my/path来实现,但如果我在另一个文件夹中该怎么办?

  • 第二个问题比较棘手。只要给定参数中有空格,我的脚本就会失败。虽然$shorter正是我想要的(例如/home/jack/my\ folder/subfolder),但cd失败时会出现错误/usr/bin/script : line 4 : cd: /home/jack/my\: no file or folder of this type。我想我已尝试过所有内容,使用cd '$shorter'cd "'"$shorter"'"之类的内容无济于事。我错过了什么?

非常感谢您的回答

5 个答案:

答案 0 :(得分:2)

.bashrc中添加以下行:

function shorter() { cd "${1%/*}"; }
  • %表示从末尾删除较小的模式
  • /*是patern

然后在你的终端:

$ . ~/.bashrc   # to refresh your bash configuration
$ type shorter  # to check if your new function is available
shorter is a function
shorter () 
{ 
    cd "${1%/*}"
}
$ shorter ./your/directory/filename  # this will move to ./your/directory

答案 1 :(得分:1)

对于第一部分,根本不需要shorter变量。你可以这样做:

#!/bin/bash

cd "${1%/*}"

解释

大多数shell(包括bash)都具有所谓的参数扩展,它们非常强大和高效,因为它们允许您在shell中通常需要调用来操作变量到外部二进制文件。

通过外部调用可以使用参数扩展的两个常见示例是:

${var%/*} # replaces dirname
${var##*/} # replaces basename

请参阅Parameter Expansion上的此常见问题解答以了解详情。事实上,虽然你可能会在整个常见问题解答中找到答案

答案 2 :(得分:1)

第一部分:

  • 目录的更改将不会超出脚本的生命周期,因为您的脚本在新的shell进程中运行。但是,您可以使用shell别名或shell函数。例如,您可以将代码嵌入到shell函数中,并在.bash_profile或其他源位置定义。

    mycdfunction () {
         cd /blah/foo/"$1"
    }
    

至于“名称中的空格”位:

  • 在Bourne shell中引用变量的一般语法是:"$var" - "double quotes"告诉shell 展开其中的任何变量,但是以分组将结果作为单个参数。

  • 省略$var周围的双引号会告诉shell扩展变量,但是分割结果转换为空格上的参数(“单词”)。这就是shell通常分割参数的方式。

  • 使用'single quotes'导致shell 不展开任何内容,但分组参数togethers。

  • 当你输入(或在脚本中)时,你可以使用\(反斜杠空白)来逃避空间,但这通常比使用时更难阅读'single quotes'"double quotes" ...

请注意,扩展阶段包括:$variables wild?cards* {grouping,names}with-braces $(echo command substitution)以及其他效果。

                    |   expansion    |   no expansion
      -------------------------------------------------------
        grouping    |     "  "       |    '   '
        splitting   |  (no punc.)    |  (not easily done)

答案 3 :(得分:1)

当您将脚本放在/usr/bin内时,您可以在任何地方调用它。并且处理shell中的空格只是将目标放在“”之间(但这并不重要!!)。 那么这是一个演示:

#!/bin/bash

#you can use dirname but that's not apropriate
#shorter=$(dirname $1)
#Use parameter expansion (too much better)
shorter=${1%/*}

echo $shorter

答案 4 :(得分:1)

另一种方法,因为您的Mac上有dirname

#!/bin/sh
cd "$(dirname "$1")"

由于您在评论中提到您希望能够将文件拖到窗口中并cd向它们添加,因此您可能希望使脚本允许文件目录路径为参数:

#!/bin/sh
[ -f "$1" ] && set "$(dirname "$1")"  # convert a file to a directory
cd "$1"