如何编写单行shell命令创建带递增序号文件夹并将文件逐一移入
你编写的命令未生效是因为循环体使用了()包裹,这会触发子shell执行逻辑,子shell内对num变量的修改无法同步到父shell环境,导致每次循环的num值都无法正常累加。
以下是两个可直接使用的单行实现方案:
方案1:基于原有逻辑优化,兼容性更强
修改子shell问题,同时兼容带空格、特殊符号的文件名场景:
num=0; while IFS= read -r p; do ((num++)) && mkdir -p "folder_${num}" && mv -- "${p}" "folder_${num}"; done < txt_list
可选优化:如果不需要保留txt_list中间文件,可以直接合并排序逻辑,无需提前生成文件:
num=0; while IFS= read -r p; do ((num++)) && mkdir -p "folder_${num}" && mv -- "${p}" "folder_${num}"; done < <(ls -1 | sort -V)
方案2:借助工具自动生成序号,写法更简洁
不需要手动维护计数变量,用nl命令自动给文件列表加行号处理:
nl -n ln txt_list | xargs -L 1 sh -c 'mkdir -p "folder_$1" && mv -- "$2" "folder_$1"' sh
内容的提问来源于stack exchange,提问作者Johnny Tam
相关产品推荐
相关产品推荐

