これに関するオンライン文書がたくさんあり、bash
マニュアルページも非常に素晴らしいです。それにもかかわらず、なぜこれがうまくいかないのかわかりません。どうやら何か抜けたようですが…
file010
、file020
...という名前の100個のファイルを含むディレクトリがありますfile1000
。私はそれらの名前をnew00..99
usingに変更したいと思いますmv
(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
ベストアンサー1
あなたは何を見逃していますか?mv
仕組み。
正確に2つのファイルを提供する場合は、最初のファイル名を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