在Linux中重命名文件时包含文件夹名称
我已经使用该命令重命名多个目录中的文件并将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
...等等,在每个文件夹中。
任何帮助将不胜感激。
例如,我可以做如下:
$ 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
为了测试它,我尝试了'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
@ pzd060用新的答案更新 –
@ pzd060'ALL?A1?PICS?D44203-2.jpg ......这是不正确的,应该是D44203-2.jpg'应该是什么?我不明白。文件之前不需要文件夹? –
为了得到一个文件,你可以做$(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"' {} \;
我正在尝试它在当前目录(测试目的),当我运行它时,我有 mv:rename ../D44203/9.jpg到D44203 /../ D44203/9.jpg $ .jpg:没有这样文件或目录 – pzd060
@ pzd060。对不起,没有按照我自己的意见。我只是将斜线改为破折号。 –
可以使用精一行代码:
find . -name '*.jpg' -execdir \
bash -c 'd="${PWD##*/}"; [[ "$1" != "$d-"* ]] && mv "$1" "./$d-$1"' - '{}' \;
此命令使用安全的方法来检查是否映像名称已经不是当前目录名称的前缀。您也可以多次运行它,并且第一次运行后图像名称不会重命名。
将'1.jpg'重命名为'folder-name-1.jpg'并不会使__unique__。你基本上试图为所有文件名添加_prefix_。 – devnull
如果您自己创建了这个命令,那很简单..停止使用网络中的代码片段。这很危险 – hek2mgl
Perl分发中的'rename'可能会有帮助。 – devnull