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

Posted

技术标签:

【中文标题】在linux中重命名文件时包含文件夹名称【英文标题】:Include folder name in renaming a file in linux 【发布时间】:2014-03-05 04:53:12 【问题描述】:

我已经使用该命令重命名多个目录中的文件并将 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 ... 以此类推,在每个文件夹中。

任何帮助将不胜感激。

【问题讨论】:

1.jpg 重命名为folder-name-1.jpg 并不能使其独一无二。您实际上是在尝试为所有文件名添加 prefix 如果你自己创建了这个命令会很容易.. 停止使用来自网络的 sn-ps。这很危险 rename 来自 Perl 发行版可能会有所帮助。 devnull - 文件夹名称实际上是产品的 SKU,所以它是唯一的。 hek2mgl - 我是 php 开发人员,linux 不是我的强项,我在本地测试了脚本,然后在服务器上执行。 @pzd060 这正是我所说的:使用给定字符串为文件名添加前缀不会使这些文件名唯一。 【参考方案1】:

例如我可以这样做:

$ 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' | while read fn; do name=$(basename "$fn") ; dir=$(dirname "$fn") ; mv "$fn" "$dir/$(basename $(pwd))-$name" ;done,我得到了 ALL?A1?PICS?D44203-2.jpg ...这是不正确的,应该是 D44203-2.jpg @pzd060 ALL?A1?PICS?D44203-2.jpg ... which is not correct, it should be D44203-2.jpg 应该是什么?我不明白。文件前不需要文件夹? 我想用 ../D44203 测试...所以在运行 `find 之前只有 1 个文件受到影响。 -iname'*.jpg' `因为这将重命名 20 000 个文件,我想确保它有效。 @pzd060 将mv 替换为echo 并显示部分结果。【参考方案2】:

你可以使用精细的单线:

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

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

【讨论】:

在我的本地计算机上它运行良好......但是当我在服务器上尝试它时,我得到 mv: cannot move ./8.jpg' to ./D46107-./8.jpg': No such file or directory,你知道为什么吗? 您确定您使用的是-execdir 而不是-exec 我当然确定,我复制/粘贴了在本地计算机上工作的相同命令。奇怪的是,它在服务器上给出了我上面显示的结果。 这很奇怪,因为我再次测试了它。也可以试试:find . -name '*.jpg' -exec bash -c 'd="$1%/*"; mv "$1" "$d/$d-$1##*/"' - '' \;命令【参考方案3】:

要获取文件的文件夹名称,您可以使用$(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 to D44203/../D44203/9.jpg $.jpg: 没有这样的文件或目录 @pzd060。对不起,没有听从我自己的建议。我只是将斜杠改为破折号。

以上是关于在linux中重命名文件时包含文件夹名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在上传过程中重命名图像文件

使用 fs 在 multer 中重命名上传的图像

如何在 HIVE 的分区中重命名文件

如何在 Android Studio 中重命名软件包名称

[Linux] Linux中重命名文件和文件夹的方法(mv命令和rename命令)

Linux中重命名乱码文件