我有一组文件,其名称包含字符*
。例如,文件名可能是***abcdef
。我想将此文件名更改为3_abcdef
,将 替换为中*
的数字。*
我有一个可以重命名多个文件的脚本,但我不知道如何更改该脚本来执行上述任务。
这是我目前所拥有的:
find drp/ -depth -name "*abc.tab" -exec rename 's/\abc.tab$/xyz.tab/' {} +
我怎样才能使它适应这项任务?
答案1
您可以在重命名时使用实际表达式。在本例中,我们匹配尽可能多的星号,然后将其替换为匹配的长度:
rename 's/^[*]+/sprintf("%d_", length $&)/e' -vn *
如果看起来正确,请删除该-n
参数。这只是为了让您安全地进行测试。
这是我的测试工具:
$ touch \*{,\*{,\*}}abc.tab
$ rename 's/^[*]+/sprintf("%d_", length $&)/e' -vn *
***abc.tab renamed as 3_abc.tab
**abc.tab renamed as 2_abc.tab
*abc.tab renamed as 1_abc.tab
如果您还想进行其他重命名,可以将其链接起来:
$ rename 's/^[*]+/sprintf("%d_", length $&)/e; s/abc/xyz/' -vn *
***abc.tab renamed as 3_xyz.tab
**abc.tab renamed as 2_xyz.tab
*abc.tab renamed as 1_xyz.tab
答案2
假设您想用实际数字替换前面的“*”的数量(如您的示例所示),并考虑到子文件夹存在的可能性并忽略不可见文件,python 选项将是:
#!/usr/bin/env python3
import os
import shutil
import sys
sourcedir = sys.argv[1]
for root, dirs, files in os.walk(sourcedir):
for name in files:
if not name.startswith(".") and name.count("*") != 0:
number = name.count("*"); newname = str(number)+"_"+name.replace("*", "")
shutil.move(root+"/"+name, root+"/"+newname)
将其复制到一个空文件中,另存为rename.py
,通过命令运行:
python3 path/to/rename.py </path/to/files>
它重命名
****banana.txt
**monkey.mp3
**************test
进入:
4_banana.txt
2_monkey.mp3
14_test
答案3
如果您需要一行 bash 脚本。
$ find . -type f -exec bash -c 'file=$(basename "$0"); rn=$(echo "$file"|grep -o "*"|wc -l); on=$(echo "$file"|tr -d "*"); mv "$file" "${rn}_${on}"' {} \;
$ ls
0_a.txt 1_a.txt 2_a.txt 3_a.txt
如果您需要一个 shell 脚本。
#!/bin/bash
changed=0
for file in *
do
rn=$(echo "$file"|grep -o '*'| wc -l)
on=$(echo "$file"|tr -d '*')
if [ "$rn" -ne 0 ]
then
mv -v "$file" "$rn"_"$on"
((changed++))
fi
done
if [ $changed -gt 0 ]
then
echo "Have renamed $changed files"
else
echo "There are no files to rename"
fi
输出
$ ./a.sh
`***a.txt' -> `3_a.txt'
`**a.txt' -> `2_a.txt'
`******b.txt' -> `6_b.txt'
`**b.txt' -> `2_b.txt'
Have renamed 4 files
我建议使用 shell 脚本,因为它有更多的验证。