重命名文件并将父目录名称附加到文件名中?

重命名文件并将父目录名称附加到文件名中?

我正在尝试重命名文件并将其父目录名称附加到它们(并将它们移动到名为“照片”的新文件夹)。

我一直在尝试这样做改名毫米波,但是当我站在下面示例中的目录 A 中时,我很难做到这一点。

$ pwd
/A
$ tree
.
├── 1.jpg
├── 2.jpg
└── 3.jpg

但是,当从文件夹层次结构中上一级运行重命名时,它工作正常。

$ pwd
/
$ tree
.
└── A
    ├── 1.jpg
    ├── 2.jpg
    └── 3.jpg

$ rename 's|(.*)/(.*)|$1/Photos/$1 - $2|' */*.jpg -p
$ tree
.
└── A
    └── Photos
        ├── A\ -\ 1.jpg
        ├── A\ -\ 2.jpg
        └── A\ -\ 3.jpg

当站在示例中的目录“A”中时,如何实现这一点?

答案1

rename好吧,这比我所拥有的更奇特,所以首先尝试使用 sed:

Dir=$(basename "$PWD")
mkdir -p Photos
ls *.jpg|sed 's|\(.*\)|mv "\1" "Photos/'"$Dir"' - \1"|'    |sh

我想这会转化为你的重命名,如下所示:

Dir=$(basename "$PWD")
rename 's|(.*)|Photos/'"$Dir"' - $1|' *.jpg -p

答案2

扩展于安德烈·博德的回答。我还对该rename命令做了一些进一步的实验。这四种变体都可以工作,而且可能可以做得更干净。我注意到 AndreBeaud 没有使用eval,而是使用单引号来连接字符串。便利。

  1. 简短但有点难以阅读。

    rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' `pwd`/*.jpg --make-dirs
    
  2. 替换部分中的文件夹名称更易于阅读。

    eval "rename 's|(.*)|Photos/$(basename `"pwd"`) - \$1|' *.jpg --make-dirs"
    
  3. 首先创建变量。在这种情况下并不重要,因为它只使用一次。易于遵循。

    Dir=$(basename `"pwd"`); eval "rename 's|(.*)|Photos/$Dir - \$1|' *.jpg --make-dirs"
    
  4. 变量在前,但查找部分带有文件夹名称,很乱。

    Dir=$(basename `"pwd"`); rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' ../$Dir/*.jpg --make-dirs
    

结合 AndreBeaud 和我的版本可以制作这个简短的版本:

rename 's|(.*)|Photos/'"$(basename "$PWD")"' - $1|' *.jpg --make-dirs

相关内容