Linux用
用 bash
展開花括號
網上有很多關於此的文件,
bash
手冊頁非常好。即便如此,我還是不明白為什麼這不起作用。顯然我錯過了一些東西……我有一個包含 100 個文件的目錄,名為
file010
,file020
…file1000
。我希望它們重命名為new00..99
usingmv
(mvg
實際上,但是兩者都有相同的輸出)。當我執行以下任何一項時,我得到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