Bash

批量重命名寬度不等的文件

  • November 14, 2022

我有像這樣的文件

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'

更通用的解決方案(自bash3.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 更改為任何其他數字。

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