使用文件夹名称在Linux中批量重命名文件

使用文件夹名称在Linux中批量重命名文件

我有很多目录(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命令使用正则表达式

  1. 捕捉文件名直到最后一个目录分隔符/(例如2005)并将其存储在$1
  2. 捕获最后一个目录分隔符后的文件名/(例如01.jpg)并将其存储在$2
  3. 将每个文件重命名为Folder $1 - $2(例如Folder 2005 - 01.jpg)。

rename -n在实际运行命令之前,使用开关查看将会做出哪些更改。


笔记:这种模式:

s#(.*?)([^/]+)/([^/]+)$#$1Folder $2 - $3#

会更加健壮,因为即使您没有给出示例中特定目录的相对路径符号,它也能让您正确地重命名文件。不过,这种模式解释起来有点复杂,因为它依赖于更复杂的匹配属性。

相关内容