Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
Bash 在目录上迭代并替换'+';从文件名到'_';在狂欢节上_Bash_Shell - Fatal编程技术网

Bash 在目录上迭代并替换'+';从文件名到'_';在狂欢节上

Bash 在目录上迭代并替换'+';从文件名到'_';在狂欢节上,bash,shell,Bash,Shell,我有一个名为assets的目录,它还有一组目录 user_images |-content_images |-original |-cropped |-resize |-gallery_images |-slider_images |-logo 这些文件夹可以包含像原始,裁剪,调整大小这样的文件夹。这些文件夹还会有图像。这些图像的名称如下–14562345+Image.jpeg。我需要将所有具有+的图像/文件替换为. for f in ls -a; do if [[ $f

我有一个名为assets的目录,它还有一组目录

user_images
|-content_images
  |-original
  |-cropped
  |-resize
|-gallery_images
|-slider_images
|-logo
这些文件夹可以包含像
原始
裁剪
调整大小
这样的文件夹。这些文件夹还会有图像。这些图像的名称如下–
14562345+Image.jpeg
。我需要将所有具有
+
的图像/文件替换为
.

for f in ls -a;
do
     if [[ $f == ​+​ ]]
       then                
         cp "$f" "${f//+/_}"
       fi
done

我可以在当前目录中执行此操作。但我需要将其迭代到其他许多目录。我如何才能做到这一点?

您可以在流程替换中使用
find
来使用此循环:

cd user_images

while IFS= read -r -d '' f; do
   echo "$f"
   mv "$f" "${f//+/_}"
done < <(find . -name '*+*' -type f -print0)
cd用户图像
而IFS=read-r-d''f;做
回音“$f”
mv“$f”“${f/+/+/}”

使用
find-exec<完成:

find user_images -type f \
-exec bash -c '[[ $0 == *+* ]] && mv "$0" "${0//+/_}"' {} \;
请注意,这将使用
mv
而不是
cp
,因为问题的状态是“重命名”,如果您想保留原始文件,只需将其替换为
cp


bash-c
必须能够操作文件名,否则我们可以在
-exec
操作中直接使用
{}

以下操作将递归运行,并将所有文件重命名为+并替换为

find . -name '*+*' -type f -execdir bash -c 'for f; do mv "$f" "${f//+/_}"' _ {} +
注意
-execdir
的用法:

与-exec类似,但指定的命令是从包含匹配文件的子目录运行的,该子目录通常不是启动查找的目录--引用自
man find


如果目录名与您不想重命名的模式匹配,这将保护我们。

它显示目录中的所有th文件,但不重命名文件。我的意思是它什么都不做。echo$f显示所有文件,但不重命名或复制文件。此命令经过全面测试,在我的shell上运行。确保使用
bash
运行它。检查
f='14562345+Image.jpeg'的输出;echo“${f/+/+/}”
工作正常。我想可能有一些许可问题。