我有很多目录(2005-2012),每个文件 (01.jpg-100.jpg)。
如果我想将所有文件重命名到基目录中,例如重命名为,文件夹 2005 - 01.jpg那么,在 Linux 中通过命令行执行此操作的最简单的方法是什么?
例如从
/home/mark/images/2005/01.jpg
/home/mark/images/2005/02.jpg
/home/mark/images/2005/03.jpg
/home/mark/images/2006/01.jpg
/home/mark/images/2006/02.jpg
/home/mark/images/2006/03.jpg
到
/home/mark/images/Folder 2005 - 01.jpg
/home/mark/images/Folder 2005 - 02.jpg
/home/mark/images/Folder 2005 - 03.jpg
/home/mark/images/Folder 2006 - 01.jpg
/home/mark/images/Folder 2006 - 02.jpg
/home/mark/images/Folder 2006 - 03.jpg
肯定有一个简单的一行代码可以实现这一点吧?我知道你可以使用例如{2005-2012}
来访问多个目录,但我不确定如何在重命名时访问该值。
答案1
#!/bin/bash
for year in 20??; do
pushd "$year"
for file in *; do
echo mv "$file" ../"Folder ${year} - ${file}"
done
popd
done
echo
如果输出看起来不错,则删除。
答案2
尝试这个,假设你位于 2005 至 2012 目录的目录中):
start=$PWD
for directory in *; do
cd "$directory"
for filename in *; do
mv "$filename" ../"Folder $directory - $filename"
done
cd "$start"
done
或者作为一句话
start=$PWD; for directory in *; do cd "$directory"; for filename in *; do mv "$filename" ../"Folder $directory - $filename"; done; cd "$start"; done
输入树:
.
├── 2005
│ ├── 01.jpg
│ ├── 02.jpg
│ └── 03.jpg
├── 2006
│ ├── 01.jpg
│ ├── 02.jpg
│ └── 03.jpg
输出树:
.
├── 2005
├── 2006
├── Folder\ 2005\ -\ 01.jpg
├── Folder\ 2005\ -\ 02.jpg
├── Folder\ 2005\ -\ 03.jpg
├── Folder\ 2006\ -\ 01.jpg
├── Folder\ 2006\ -\ 02.jpg
└── Folder\ 2006\ -\ 03.jpg
答案3
您可能有 Perl,因此在大多数发行版中也prename
安装了命令(通常链接到简单的rename
,例如在 Debian 和 Ubuntu 中)。
如果是这种情况,那么您可以使用一行代码来完成:
$ ls *
2005:
01.jpg 02.jpg 03.jpg
2006:
01.jpg 02.jpg 03.jpg
$ rename 's#(.+)/(.+)#Folder $1 - $2#' */*
$ ls -F1R
.:
2005/
2006/
Folder 2005 - 01.jpg
Folder 2005 - 02.jpg
Folder 2005 - 03.jpg
Folder 2006 - 01.jpg
Folder 2006 - 02.jpg
Folder 2006 - 03.jpg
./2005:
./2006:
该rename
命令使用正则表达式
- 捕捉文件名直到最后一个目录分隔符
/
(例如2005
)并将其存储在$1
- 捕获最后一个目录分隔符后的文件名
/
(例如01.jpg
)并将其存储在$2
- 将每个文件重命名为
Folder $1 - $2
(例如Folder 2005 - 01.jpg
)。
rename -n
在实际运行命令之前,使用开关查看将会做出哪些更改。
笔记:这种模式:
s#(.*?)([^/]+)/([^/]+)$#$1Folder $2 - $3#
会更加健壮,因为即使您没有给出示例中特定目录的相对路径符号,它也能让您正确地重命名文件。不过,这种模式解释起来有点复杂,因为它依赖于更复杂的匹配属性。