我试图用shell脚本将所有目录和文件重命名为大写.我有什么工作,但不适用于子目录.由于目录名在脚本执行期间发生了变化,我得到了类似的东西mv: cannot stat './def/two/three': No such file or directory
我尝试过使用-depthfind,所以它会从下往上重命名.但仍然遇到同样的问题.我虽然cut试图分开路径/并重命名,但我不知所措.
这就是我所拥有的:
for i in `find . -name "*[a-z]*"`
do new_name=`echo $i | tr '[a-z]' '[A-Z]'`
mv $i $new_name
done
Run Code Online (Sandbox Code Playgroud)
我希望任何方向,因为我觉得这应该是一项常见的任务,但未能找到一些谷歌搜索的工作解决方案.
请注意,我不能使用,rename因为我的发行版不支持.
试试这种方式:
find . -depth |while read LONG; do SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' ); DIR=$( dirname "$LONG" ); if [ "${LONG}" != "${DIR}/${SHORT}" ]; then mv "${LONG}" "${DIR}/${SHORT}" ; fi; done
Run Code Online (Sandbox Code Playgroud)
或者,如果你想要可读的版本(没有单行):
find . -depth | \
while read LONG; do
SHORT=$( basename "$LONG" | tr '[:lower:]' '[:upper:]' )
DIR=$( dirname "$LONG" )
if [ "${LONG}" != "${DIR}/${SHORT}" ]; then
mv "${LONG}" "${DIR}/${SHORT}"
fi
done
Run Code Online (Sandbox Code Playgroud)
这将按照正确的顺序重命名文件,然后重命名它们所在的目录.