Bash 在目录上迭代并替换'+';从文件名到'_';在狂欢节上
我有一个名为assets的目录,它还有一组目录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
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/+/+/}”
工作正常。我想可能有一些许可问题。