Files

將文件列表移動到位置列表

  • November 29, 2018

我想同時將多個文件移動到特定的新位置。

說我有以下

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}

但我得到了錯誤

@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[@]}" 

請注意

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實用程序一次只能重命名一個文件。

引用自:https://unix.stackexchange.com/questions/484930