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

fly*_*ire 56 linux bash command-line

可以用bash交换两个文件吗?

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

cp old tmp
cp curr old
cp tmp curr
rm tmp
Run Code Online (Sandbox Code Playgroud)

Can*_*Bal 74

$ mv old tmp && mv curr old && mv tmp curr
Run Code Online (Sandbox Code Playgroud)

效率稍高!

包装成可重复使用的shell功能:

function swap()         
{
    local TMPFILE=tmp.$$
    mv "$1" $TMPFILE && mv "$2" "$1" && mv $TMPFILE "$2"
}
Run Code Online (Sandbox Code Playgroud)

  • ...如果`tmp`出现问题,并且不会将你的文件变成必杀技.+1 (17认同)

Har*_*rdy 45

将其添加到.bashrc:

function swap()         
{
    local TMPFILE=tmp.$$
    mv "$1" $TMPFILE
    mv "$2" "$1"
    mv $TMPFILE "$2"
}
Run Code Online (Sandbox Code Playgroud)

如果您想处理中间mv操作的潜在故障,请检查Can Bal的答案.

请注意,这个或其他答案都没有提供原子解决方案,因为使用Linux系统调用和/或流行的Linux文件系统是不可能实现的.对于Darwin内核,请检查exchangedata系统调用.

  • 如果您在与源文件相同的目录中创建临时文件,则可以使用`ln`而不是`mv`.例如`ln"$ 1""$ tmp"; mv -f"$ 2""$ 1"; mv"$ tmp""$ 2"`这样,如果你需要回滚所有你需要做的就是丢弃临时文件,这只是一个链接到`$ 1`.它虽然不适用于目录(不能硬链接那些). (3认同)
  • 如果mv"$ 2""$ 1"失败,你如何检测到并回滚? (2认同)

cub*_*ube 32

tmpfile=$(mktemp $(dirname "$file1")/XXXXXX)
mv "$file1" "$tmpfile"
mv "$file2" "$file1"
mv "$tmpfile" "$file2"
Run Code Online (Sandbox Code Playgroud)

  • Upmod使用mktemp (4认同)
  • upmod使用相同的文件系统 (4认同)

Łuk*_*iak 28

你真的想交换它们吗?我认为值得一提的是你可以使用mv自动备份覆盖文件:

mv new old -b
Run Code Online (Sandbox Code Playgroud)

你会得到:

old and old~
Run Code Online (Sandbox Code Playgroud)

如果你愿意的话

old and old.old
Run Code Online (Sandbox Code Playgroud)

您可以使用-S将〜更改为自定义后缀

mv new old -b -S .old
ls
old old.old
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您实际上可以更快地交换它们,仅使用2 mv:

mv new old -b && mv old~ new
Run Code Online (Sandbox Code Playgroud)

  • 这看起来很有希望,但是OS X Lion上没有`-b`选项 (2认同)

Les*_*oen 13

结合最好的答案,我把它放在我的〜/ .bashrc中:

function swap()
{
  tmpfile=$(mktemp $(dirname "$1")/XXXXXX)
  mv "$1" "$tmpfile" && mv "$2" "$1" &&  mv "$tmpfile" "$2"
}
Run Code Online (Sandbox Code Playgroud)


Zyp*_*rax 6

你可以简单地移动它们,而不是制作副本.

#!/bin/sh
# Created by Wojtek Jamrozy (www.wojtekrj.net)
mv $1 cop_$1
mv $2 $1
mv cop_$1 $2
Run Code Online (Sandbox Code Playgroud)

http://www.wojtekrj.net/2008/08/bash-script-to-swap-contents-of-files/


Ric*_*ard 6

这是我用作系统($HOME/bin/swapfiles)的命令.我认为它对于恶劣是相对有弹性的.

#!/bin/bash

if [ "$#" -ne 2 ]; then
  me=`basename $0`
  echo "Syntax: $me <FILE 1> <FILE 2>"
  exit -1
fi

if [ ! -f $1 ]; then
  echo "File '$1' does not exist!"
fi
if [ ! -f $2 ]; then
  echo "File '$2' does not exist!"
fi
if [[ ! -f $1 || ! -f $2 ]]; then
  exit -1
fi

tmpfile=$(mktemp $(dirname "$1")/XXXXXX)
if [ ! -f $tmpfile ]; then
  echo "Could not create temporary intermediate file!"
  exit -1
fi

# move files taking into account if mv fails
mv "$1" "$tmpfile" && mv "$2" "$1" && mv "$tmpfile" "$2"
Run Code Online (Sandbox Code Playgroud)