![重命名文件并将父目录名称附加到文件名中?](https://linux22.com/image/210967/%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6%E5%B9%B6%E5%B0%86%E7%88%B6%E7%9B%AE%E5%BD%95%E5%90%8D%E7%A7%B0%E9%99%84%E5%8A%A0%E5%88%B0%E6%96%87%E4%BB%B6%E5%90%8D%E4%B8%AD%EF%BC%9F.png)
我正在尝试重命名文件并将其父目录名称附加到它们(并将它们移动到名为“照片”的新文件夹)。
我一直在尝试这样做改名和毫米波,但是当我站在下面示例中的目录 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
,而是使用单引号来连接字符串。便利。
简短但有点难以阅读。
rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' `pwd`/*.jpg --make-dirs
替换部分中的文件夹名称更易于阅读。
eval "rename 's|(.*)|Photos/$(basename `"pwd"`) - \$1|' *.jpg --make-dirs"
首先创建变量。在这种情况下并不重要,因为它只使用一次。易于遵循。
Dir=$(basename `"pwd"`); eval "rename 's|(.*)|Photos/$Dir - \$1|' *.jpg --make-dirs"
变量在前,但查找部分带有文件夹名称,很乱。
Dir=$(basename `"pwd"`); rename 's|.*/(.*)/(.*)|Photos/$1 - $2|' ../$Dir/*.jpg --make-dirs
结合 AndreBeaud 和我的版本可以制作这个简短的版本:
rename 's|(.*)|Photos/'"$(basename "$PWD")"' - $1|' *.jpg --make-dirs