首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在bash中交换两个文件的最短方式

在bash中交换两个文件的最短方式
EN

Stack Overflow用户
提问于 2009-07-12 12:01:35
回答 15查看 41.7K关注 0票数 65

在bash中可以交换两个文件吗?

或者,可以用比这个更短的方式交换它们:

代码语言:javascript
运行
复制
cp old tmp
cp curr old
cp tmp curr
rm tmp
EN

Stack Overflow用户

发布于 2014-06-29 01:59:29

我在我交付的工作脚本中有这一点。它是作为一个函数编写的,但您需要调用它

代码语言:javascript
运行
复制
d_swap lfile rfile

GNU mv具有-b和-T开关。您可以使用-T开关处理目录。

引号用于带有空格的文件名。

它有点冗长,但我已经在文件和目录中多次使用过它。在某些情况下,您可能希望使用目录的名称重命名文件,但此函数不会处理此问题。

如果您想要做的只是重命名文件(让它们保持原样),那么这样做的效率不是很高,这最好使用shell变量来完成。

代码语言:javascript
运行
复制
d_swap() {
 test $# -eq 2 || return 2

 test -e "$1" || return 3
 test -e "$2" || return 3

 if [ -f "$1" -a -f "$2" ]
 then
    mv -b "$1" "$2" && mv "$2"~ "$1"
    return 0
 fi

 if [ -d "$1" -a -d "$2" ]
 then
    mv -T -b "$1" "$2" && mv -T "$2"~ "$1"
    return 0
 fi

 return 4
}

此函数将重命名文件。它使用一个临时名称(它用一个点'.‘在名称前面),以防文件/目录在同一目录中,这通常是这种情况。

代码语言:javascript
运行
复制
d_swapnames() {
    test $# -eq 2 || return 2

    test -e "$1" || return 3
    test -e "$2" || return 3

    local lname="$(basename "$1")"
    local rname="$(basename "$2")"

    ( cd "$(dirname "$1")" && mv -T "$lname" ".${rname}" ) && \
    ( cd "$(dirname "$2")" && mv -T "$rname" "$lname" ) && \
    ( cd "$(dirname "$1")" && mv -T ".${rname}" "$rname" )
}

这要快得多(不需要复制,只需要重命名)。它甚至更丑陋。它将重命名任何东西:文件、目录、管道、设备。

票数 0
EN
查看全部 15 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1115904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档