Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中重命名文件时包含文件夹名称_Linux_Bash_Renaming - Fatal编程技术网

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

在linux中重命名文件时包含文件夹名称,linux,bash,renaming,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。我需要这些

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

要获取文件的文件夹名,可以执行
$(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"' {} \;
find../-name'*.jpg'-exec sh-c'mv“$0”“$(basename$(dirname$0))-${0%.jpg}$.jpg”{};

您可以使用精细的一行:

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

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

1.jpg
重命名为
folder-name-1.jpg
不会使其唯一。实际上,您正在尝试为所有文件名添加前缀。如果您自己创建了该命令,那么就很容易了。。停止使用网络中的代码片段。这很危险,Perl发行版中的重命名可能会有所帮助。devnull-文件夹名称实际上是产品的SKU,因此它是唯一的。hek2mgl-我是一名php开发人员,linux不是我的强项,我在服务器上运行脚本之前在本地进行了测试。@pzd060这正是我所说的:使用给定字符串前缀文件名不会使它们唯一。我正在当前目录中尝试它(测试目的),当我运行它时,我有mv:rename../D44203/9.jpg到D44203/。/D44203/9.jpg$。jpg:没有这样的文件或directory@pzd060. 对不起,我没有听从自己的建议。我只是把斜杠改成了破折号。为了测试它,我在阅读fn时尝试了
find../D44203-iname'2.jpg';do name=$(basename“$fn”);dir=$(dirname“$fn”);mv“$fn”“$dir/$(basename$(pwd))-$name”;完成后
我得到了所有?A1?图片?D44203-2.jpg。。。这是不正确的,它应该是D44203-2。jpg@pzd060
ALL?A1?PICS?D44203-2.jpg。。。哪个不正确,应该是D44203-2。jpg应该是什么?我不明白。文件之前不需要文件夹?我想用../D44203进行测试。。。因此,在运行'find'之前,只有1个文件受到影响-在名称'*.jpg'`中,因为这将重命名20000个文件,我想确定它是否有效。@pzd060将
mv
替换为
echo
,并显示部分结果。在我的本地计算机上,它工作得很好。。。但是当我在服务器上尝试时,我得到了mv:cannot move
/8.jpg'/D46107-/8.jpg':没有这样的文件或目录
,你知道为什么吗?你确定你使用了
-execdir
而不是
-exec
?当然,我肯定,我复制/粘贴了在本地计算机上运行的同一个命令。奇怪的是,在服务器上,它给出了我在上面向您展示的结果。这很奇怪,因为我再次测试了它。您也可以尝试:
find-名称'*.jpg'-execbash-c'd=“${1%/*}”;mv“$1”$d/$d-${1}.*/}'-{}命令