在linux中重命名文件时包含文件夹名称

时间:2014-02-07 16:55:22

标签: linux bash renaming

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

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 ...等等,在每个文件夹中。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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"' {} \;

答案 2 :(得分:0)

你可以使用精细的单行:

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

此命令使用安全方法检查图像名称是否已经没有当前目录名称作为前缀。您也可以多次运行它,并且在首次运行后不会重命名图像名称。