2014-02-07 75 views
1

我已经使用该命令重命名多个目录中的文件并将JPG更改为jpg,因此我具有一致性。在Linux中重命名文件时包含文件夹名称

find . -name '*.jpg' -exec sh -c 'mv "$0" "${0%.JPG}$.jpg"' {} \; 

你有任何想法如何改变这种状况,包括在文件

我执行的是一个包含约2000文件夹中的文件夹(SKU的)或产品的名称的文件夹名称.. 。在每个SKU文件夹内,有9个图像。 1.jpg 2.jpg .... 9.jpg。

所以底线是我有2000图像,名称为1.jpg,2.jpg ... 9.jpg。我需要这些文件是唯一的,例如:

folder-name-1.jpg ... folder-name.2.jpg ...等等,在每个文件夹中。

任何帮助将不胜感激。

+1

将'1.jpg'重命名为'folder-name-1.jpg'并不会使__unique__。你基本上试图为所有文件名添加_prefix_。 – devnull

+0

如果您自己创建了这个命令,那很简单..停止使用网络中的代码片段。这很危险 – hek2mgl

+0

Perl分发中的'rename'可能会有帮助。 – devnull

回答

0

例如,我可以做如下:

$ find . -iname '*.jpg' | while read fn; do name=$(basename "$fn") ; dir=$(dirname "$fn") ; mv "$fn" "$dir/$(basename "$dir")-$name" ;done 
./lib/bukovina/version.jpg ./lib/bukovina/bukovina-version.jpg 
./lib/bukovina.jpg ./lib/lib-bukovina.jpg 
+0

为了测试它,我尝试了'find ../D44203 -iname'2.jpg'|同时阅读fn; do name = $(basename“$ fn”); dir = $(dirname“$ fn”); mv“$ fn”“$ dir/$(basename $(pwd)) - $ name”; done',我得到了所有?A1?PICS?D44203-2.jpg ......这是不正确的,应该是D44203 -2.jpg – pzd060

+0

@ pzd060用新的答案更新 –

+0

@ pzd060'ALL?A1?PICS?D44203-2.jpg ......这是不正确的,应该是D44203-2.jpg'应该是什么?我不明白。文件之前不需要文件夹? –

0

为了得到一个文件,你可以做$(basename $(dirname ${FILE})),其中${FILE}是可以相对,但必须包含前至少一个文件夹的路径的文件夹名称文件名在里面。这应该不是find的问题。如果是这样,只需从一个目录运行它。

find . -name '*.jpg' -exec sh -c 'mv "$0" "$(basename $(dirname $0))-${0%.JPG}$.jpg"' {} \; 

或者,如果你在你的当前目录下有JPEG图片:

find ../<dirname> -name '*.jpg' -exec sh -c 'mv "$0" "$(basename $(dirname $0))-${0%.JPG}$.jpg"' {} \; 
+0

我正在尝试它在当前目录(测试目的),当我运行它时,我有 mv:rename ../D44203/9.jpg到D44203 /../ D44203/9.jpg $ .jpg:没有这样文件或目录 – pzd060

+0

@ pzd060。对不起,没有按照我自己的意见。我只是将斜线改为破折号。 –

0

可以使用精一行代码:

find . -name '*.jpg' -execdir \ 
     bash -c 'd="${PWD##*/}"; [[ "$1" != "$d-"* ]] && mv "$1" "./$d-$1"' - '{}' \; 

此命令使用安全的方法来检查是否映像名称已经不是当前目录名称的前缀。您也可以多次运行它,并且第一次运行后图像名称不会重命名。

+0

在我的本地计算机上它工作完美......但是当我在服务器上尝试时,我得到了mv:无法将'./8.jpg'移动到./D46107-./8.jpg':没有这样的文件或目录' ,你知道为什么吗? – pzd060

+0

你确定你使用'-execdir'而不是'-exec'吗? – anubhava

+0

当然,我确定,我复制/粘贴了在本地计算机上运行的相同命令。奇怪的是,它在服务器上给出了我在上面给你看的结果。 – pzd060

相关问题