ファイルリストを場所リストに移動

ファイルリストを場所リストに移動

複数のファイルを同時に特定の新しい場所に移動したいと思います。

私が次のことを持っているとしましょう。

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

関連情報