У меня есть это в рабочем сценарии, который я доставил. Он написан как функция, но вы бы вызвали его
d_swap lfile rfile
У GNU mv есть ключ -b и -T. Вы можете иметь дело с каталогами, используя -T
переключатель.
Кавычки предназначены для имен файлов с пробелами.
Это немного многословно, но я много раз использовал его с файлами и каталогами. Могут быть случаи, когда вы захотите переименовать файл с именем каталога, но эта функция не обрабатывается.
Это не очень эффективно, если все, что вы хотите сделать, это переименовать файлы (оставить их там, где они есть), что лучше сделать с помощью переменной оболочки.
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
}
Эта функция будет переименовывать файлы. Он использует временное имя (ставит точку «.» Перед именем) на тот случай, если файлы / каталоги находятся в одном каталоге, как это обычно бывает.
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" )
}
Это намного быстрее (нет копирования, просто переименование). Это еще страшнее. И он будет переименовывать что угодно: файлы, каталоги, каналы, устройства.