如何查找所有.PNG文件并移至1、2、3…等单文件新文件夹
单PNG文件自动分文件夹的Bash脚本修复方案
你的原脚本核心问题出在算术运算语法错误,以及文件名数字提取逻辑的不严谨性,以下是两种可行的修复方案:
方案一:按处理顺序生成递增文件夹
如果不需要基于文件名数字,仅按文件排序后的顺序生成target-1、target-2这类文件夹,用以下脚本:
#!/bin/bash count=1 # 查找所有png文件,按版本号排序,逐个处理 find . -name "*.png" -print0 | sort -z --version-sort | while IFS= read -r -d '' file; do TARGET="target-$count" mkdir -p "$TARGET" mv "$file" "$TARGET/" ((count++)) done
方案优势:
- 用
while read循环替代xargs + bash -c,避免复杂的传参错误,逻辑更直观 find -print0配合read -d '',完美处理带空格、特殊字符的文件名- 递增计数生成文件夹名,不会出现因文件名无数字导致的报错
方案二:基于文件名中的数字生成文件夹
如果需要提取文件名里的数字来命名文件夹(比如img456.png对应target-456),用以下脚本:
#!/bin/bash count=1 find . -name "*.png" -print0 | sort -z --version-sort | while IFS= read -r -d '' file; do # 提取文件名中的第一个连续数字串 filename=$(basename "$file") num=$(echo "$filename" | grep -oE '[0-9]+' | head -n1) # 如果文件名无数字,用递增计数兜底 if [ -z "$num" ]; then num=$count ((count++)) fi TARGET="target-$num" mkdir -p "$TARGET" mv "$file" "$TARGET/" done
原脚本错误点说明:
- 算术表达式语法错误:
$((${1//[^0-9]/} "/ 0 + 1))中的"/是无效语法,且如果文件名无数字,会变成$((/0 +1))直接触发运算错误 xargs传参逻辑复杂:xargs -0n1 bash -c的传参方式容易因文件名特殊字符导致变量解析异常,while read循环更可靠- 未处理无数字的文件名:原脚本默认所有文件名都含数字,一旦遇到无数字的文件就会直接崩溃
内容的提问来源于stack exchange,提问作者DEV186516844
相关产品推荐
相关产品推荐

