我想重命名一个文件夹中的多个文件。
我希望保留所有原始文件名减去末尾的标签。
例如我有:
FILE1[file].doc
FILE2[file].doc
FILE3[file].doc
ETC
我想[file]
递归地删除文件夹中的所有文件,并希望从命令行执行此操作。
任何帮助将不胜感激。
答案1
我假设您当前的工作目录是包含您要重命名的文件的目录,如以下示例所示:
$ tree
.
├── FILE1[file].doc
├── FILE2[file].doc
├── FILE3[file].doc
└── subdir
├── FILE1[file].doc
├── FILE2[file].doc
└── FILE3[file].doc
现在,您可以运行以下命令以递归方式列出当前目录中具有扩展名的所有文件.doc
:
$ find . -type f -iname '*.doc'
./subdir/FILE3[file].doc
./subdir/FILE2[file].doc
./subdir/FILE1[file].doc
./FILE3[file].doc
./FILE2[file].doc
./FILE1[file].doc
要重命名所有这些文件并删除每个名称中扩展名[file]
之前的部分.doc
(如果存在),请运行以下命令:
$ find . -type f -iname '*.doc' -exec rename -v 's/\[file\](?=\.doc$)//' {} +
./subdir/FILE3[file].doc renamed as ./subdir/FILE3.doc
./subdir/FILE2[file].doc renamed as ./subdir/FILE2.doc
./subdir/FILE1[file].doc renamed as ./subdir/FILE1.doc
./FILE3[file].doc renamed as ./FILE3.doc
./FILE2[file].doc renamed as ./FILE2.doc
./FILE1[file].doc renamed as ./FILE1.doc
这将执行命令rename -v 's/\[file\](?=\.doc$)//' FILES
,其中替换为上面显示的命令FILES
返回的文件列表。find
所做的rename 's/PATTERN/REPLACEMENT/'
是将正则表达式模式\[file\](?=\.doc$)
(如果行尾跟着精确的字符串“.doc”,则匹配精确的字符串“[file]”)应用于每个指定的文件名。如果匹配,则文件名的匹配部分将被替换为替换字符串,在我们的例子中为空。
答案2
Python 方法,使用re.split()
和os.rename()
。
$ ls
FILE1[file].doc FILE2[file].doc FILE3[file].doc
$ python -c "import os,re;[os.rename(f,'.'.join(re.split('\[|\]|\.',f)[::3])) for f in os.listdir('.')]"
$ ls
FILE1.doc FILE2.doc FILE3.doc
os.listdir()
这里发生的事情是,我们按照函数提供的方式循环遍历当前工作目录中的每个文件名,re.split()
使用多个分隔符将文件名分解为字符串列表,提取第一个和最后一个字符串,然后使用函数从这两个字符串中创建新名称'.'.join()
。剩下的很简单os.rename(old,new)
请注意,这是一种简单的方法,并不能防止重命名该文件夹中的目录或其他杂散文件。