我有一堆需要重命名的文件.
file1.txt needs to be renamed to file1_file1.txt
file2.avi needs to be renamed to file2_file2.avi
Run Code Online (Sandbox Code Playgroud)
你可以看到我需要_原始文件名.
这些文件很多.
对于您的具体情况,您希望使用mmv如下:
pax> ll
total 0
drwxr-xr-x+ 2 allachan None 0 Dec 24 09:47 .
drwxrwxrwx+ 5 allachan None 0 Dec 24 09:39 ..
-rw-r--r-- 1 allachan None 0 Dec 24 09:39 file1.txt
-rw-r--r-- 1 allachan None 0 Dec 24 09:39 file2.avi
pax> mmv '*.*' '#1_#1.#2'
pax> ll
total 0
drwxr-xr-x+ 2 allachan None 0 Dec 24 09:47 .
drwxrwxrwx+ 5 allachan None 0 Dec 24 09:39 ..
-rw-r--r-- 1 allachan None 0 Dec 24 09:39 file1_file1.txt
-rw-r--r-- 1 allachan None 0 Dec 24 09:39 file2_file2.avi
Run Code Online (Sandbox Code Playgroud)
您需要注意的是,通配符匹配不是贪婪的。这意味着该文件a.b.txt将被转换为a_a.b.txt,而不是a.b_a.b.txt.
该mmv程序是作为我的 CygWin 的一部分安装的,但我必须
sudo apt-get install mmv
Run Code Online (Sandbox Code Playgroud)
在我的 Ubuntu 盒子上把它取下来。如果它不在您的标准发行版中,那么您使用的任何包管理器都希望可以使用它。
如果由于某种原因不允许您安装它,您将不得不使用bash for其他答案中显示的其他循环类型解决方案之一。我更喜欢自己的简洁,mmv但你可能没有选择。
到目前为止,所有答案都给出了:
这两个脚本解决了所有这些问题.
#!/bin/bash
while IFS= read -r -d $'\0' file; do
dirname="${file%/*}/"
basename="${file:${#dirname}}"
echo mv "$file" "$dirname${basename%.*}_$basename"
done < <(find . -type f -print0)
Run Code Online (Sandbox Code Playgroud)
#!/bin/bash
shopt -s globstar
for file in ./**; do
if [[ -f "$file" ]]; then
dirname="${file%/*}/"
basename="${file:${#dirname}}"
echo mv "$file" "$dirname${basename%.*}_$basename"
fi
done
Run Code Online (Sandbox Code Playgroud)
echo一旦您对其输出感到满意,请务必从您选择的任何脚本中删除它并再次运行它
修复了以前版本中未正确处理路径名的问题.