複数のファイルを同時に特定の新しい場所に移動したいと思います。
私が次のことを持っているとしましょう。
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
。オペランドが2つ以上で、最後のオペランドがディレクトリではないため、エラーが発生します。最後のオペランドがディレクトリのパス名である場合は、すべてのファイルがそのディレクトリに移動します(一部のファイルを2回指定するとエラーが発生する可能性があります)。
代わりに、ファイルを一度に1つずつ一時ディレクトリに移動し、名前を正しい名前に変更します。その後、もう一度移動します。
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
ユーティリティは一度に1つのファイル名のみを変更できます。
答え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