Linux

bash 展開花括號

  • March 3, 2021

網上有很多關於此的文件,bash手冊頁非常好。即便如此,我還是不明白為什麼這不起作用。顯然我錯過了一些東西……

我有一個包含 100 個文件的目錄,名為file010, file020file1000。我希望它們重命名為new00..99using mvmvg實際上,但是兩者都有相同的輸出)。當我執行以下任何一項時,我得到target 'new99' is not a directory(總是最後一個)。

我錯過了什麼?

id@machine  ~/temp/test  ls
file010  file090   file160  file240  file320  file400  file480  file560  file640  file720  file800  file880  file960
file020  file100   file170  file250  file330  file410  file490  file570  file650  file730  file810  file890  file970
file030  file1000  file180  file260  file340  file420  file500  file580  file660  file740  file820  file900  file980
file040  file110   file190  file270  file350  file430  file510  file590  file670  file750  file830  file910  file990
file050  file120   file200  file280  file360  file440  file520  file600  file680  file760  file840  file920
file060  file130   file210  file290  file370  file450  file530  file610  file690  file770  file850  file930
file070  file140   file220  file300  file380  file460  file540  file620  file700  file780  file860  file940
file080  file150   file230  file310  file390  file470  file550  file630  file710  file790  file870  file950
id@machine  ~/temp/test  mv {*,new{00..99}}
/usr/local/bin/mvg: target 'new99' is not a directory
✘ id@machine  ~/temp/test  mv {file{010..1000..10},new{00..99}}
/usr/local/bin/mvg: target 'new99' is not a directory
✘ id@machine  ~/temp/test  mv {file*,new{00..99}}
/usr/local/bin/mvg: target 'new99' is not a directory

你缺少什麼?如何mv運作。

當您提供正好 2 個文件時,您將第一個文件名重命名為第二個文件名。

如果文件超過 2 個,則將最後一個參數作為目錄,之前的所有參數都是要移動到那裡的文件。

請參閱手冊頁

要重命名文件,您需要一個循環:

i=0
for file in *; do
   mv -v "$file" "$(printf 'new%02d' $i)"
   ((i++))
done

一個想法:如果你有超過 100 個文件怎麼辦?如何避免硬編碼%02d

files=(*)
num=$(( ${#files[@]} - 1 ))
size=${#num}
for idx in "${!files[@]}"; do
   mv -v "${files[idx]}" "$(printf 'new%0*d' $size $idx)"
done

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