Bash
批量重命名寬度不等的文件
我有像這樣的文件
file1.txt file2.txt file3.txt ... file11.txt file12.txt ... file100.txt file101.txt ...
我想將它們重命名為具有相同的字元串寬度
file001.txt file002.txt file003.txt ... file011.txt file012.txt ... file100.txt file101.txt ...
是否有一個簡單的命令來實現這一點?我想避免手動重命名,例如使用 ranger bulkrename。
在手冊頁
rename(1)
中,您可以看到一個範例:EXAMPLES Given the files foo1, ..., foo9, foo10, ..., foo278, the commands rename foo foo00 foo? rename foo foo0 foo?? will turn them into foo001, ..., foo009, foo010, ..., foo278
因此,在您的情況下,簡單的解決方案(如果最大數字為 3 位長)將是:
rename file file00 file?.txt rename file file0 file??.txt
在執行實際
rename
命令之前,您可以通過添加--no-act / -n
和--verbose / -v
標誌來測試它以查看結果:$ rename -nv file file00 file?.txt `file1.txt' -> `file001.txt' `file2.txt' -> `file002.txt' `file3.txt' -> `file003.txt' $ rename -nv file file0 file??.txt `file11.txt' -> `file011.txt' `file12.txt' -> `file012.txt'
更通用的解決方案(自
bash
3.0 版起可用):$ for i in `find ./ -maxdepth 1 -type f -name 'file*.txt'`; \ do if [[ "$i" =~ file([0-9]*).txt$ ]]; \ then NUM=$(printf "%03d" "${BASH_REMATCH[1]}"); \ echo mv --verbose $i $i ./file${NUM}.txt; \ fi; \ done mv --verbose ./file1.txt ./file001.txt mv --verbose ./file2.txt ./file002.txt mv --verbose ./file3.txt ./file003.txt mv --verbose ./file11.txt ./file011.txt mv --verbose ./file12.txt ./file012.txt mv --verbose ./file100.txt ./file100.txt mv --verbose ./file101.txt ./file101.txt
echo
在您要執行更改時刪除。這只是一個簡單的範例,您可以if
在行中將文件的前綴和後綴更改為模式,並用於$BASH_REMATCH
擷取這些以進行更複雜的重命名。例如:$ for i in `find ./ -maxdepth 1 -type f`; \ do if [[ "$i" =~ ^([^0-9]*)([0-9]*).txt$ ]]; \ then NUM=$(printf "%03d" "${BASH_REMATCH[2]}"); \ echo mv --verbose $i ${BASH_REMATCH[1]}${NUM}.txt; \ fi; \ done mv --verbose ./file1.txt ./file001.txt mv --verbose ./file2.txt ./file002.txt mv --verbose ./file3.txt ./file003.txt mv --verbose ./file11.txt ./file011.txt mv --verbose ./file12.txt ./file012.txt mv --verbose ./file100.txt ./file100.txt mv --verbose ./file101.txt ./file101.txt mv --verbose ./something1.txt ./something001.txt mv --verbose ./another02.txt ./another002.txt
當然,您可以修改
printf
命令以將零填充長度從 3 更改為任何其他數字。