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)
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系统调用.
cub*_*ube 32
tmpfile=$(mktemp $(dirname "$file1")/XXXXXX)
mv "$file1" "$tmpfile"
mv "$file2" "$file1"
mv "$tmpfile" "$file2"
Run Code Online (Sandbox Code Playgroud)
Ł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)
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)
你可以简单地移动它们,而不是制作副本.
#!/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/
这是我用作系统($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)