我想同时将多个文件移动到特定的新位置。
假设我有以下内容
wrong name | c.txt | a.txt | b.txt |
Correct name| a.txt | b.txt | c.txt |
然后我想做一些类似的事情
mv ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}
但我得到了错误
答案1
请注意
mv ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}
扩展到
mv ./a.txt ./b.txt ./c.txt ./b.txt ./c.txt ./a.txt
在调用实用程序之前mv
。由于有两个以上的操作数,并且最后一个操作数不是目录,因此会出现错误。如果最后一个操作数是目录的路径名,这会将所有文件移动到该目录中(您还会因两次指定某些文件而收到一些错误)。
相反,一次将一个文件移动到临时目录中,同时将它们重命名为正确的名称。然后将它们移回来。
mkdir t
mv a.txt t/b.txt
mv b.txt t/c.txt
mv c.txt t/a.txt
mv t/*.txt ./
rmdir t
此操作没有快捷方式,该mv
实用程序一次只能重命名一个文件。
答案2
对@Kusalananda 的回答的补充:
您可以使用函数使其通用:
mv_files() {
local args=("$@")
local num_args=${#args[@]}
if [ $(bc <<< "$num_args%2") -ne 0 ]; then
echo "Number of arguments must be a multiple of 2."
return 1
else
num_files=$(bc <<< "$num_args/2")
tmpdir=$(mktemp -d -p .)
for (( i=0;i<num_files;i++ )); do
local n=$(bc <<< "$i+$num_files")
mv "${args[$i]}" "${tmpdir}/${args[$n]}"
done
mv ${tmpdir}/* .
rmdir ${tmpdir}
echo "Done."
fi
}
然后你像这样运行它:
mv_files a.txt b.txt c.txt b.txt c.txt a.txt
或者正如你所做的那样:
mv_files ./{a.txt,b.txt,c.txt} ./{b.txt,c.txt,a.txt}
或者
old=( a.txt b.txt c.txt )
new=( b.txt c.txt a.txt )
mv_files "${old[@]}" "${new[@]}"
答案3
Tried by below method
aveen_linux_example ~]# sed -n '/wrong name/p' filename | sed "s/|//g" | sed "s/ /\n/g"| sed '/^$/d'|awk '$1 !~ /wrong/ && $1 !~/name/{print $0}' > final.txt
[root@praveen_linux_example ~]# sed -n '/Correct name/p' filename| sed "s/|//g" |sed -r "s/\s+/\n/g"| sed '/^$/d'| awk '$1 !~/Correct/ && $1 !~/name/{print $0}' >final_2.txt
paste final.txt final_2.txt | awk '{print "mv" " " $1 " " $2}'| sh