我正在尝试使用shell脚本将所有目录和文件重命名为大写。我有什么工作,但不适用于子目录。由于目录名在脚本执行期间发生了变化,因此我得到mv: cannot stat './def/two/three': No such file or directory
我尝试将-depth
与find一起使用,以便从下往上重命名。但仍然遇到同样的问题。我虽然使用cut
分隔/
上的路径并重命名,但却不知所措。
这就是我所拥有的:
for i in `find . -name "*[a-z]*"`
do new_name=`echo $i | tr '[a-z]' '[A-Z]'`
mv $i $new_name
done
我很欣赏任何方向,因为我认为这应该是一项常见任务,但未能从Google搜索中找到可行的解决方案。
请注意,我不能使用rename
,因为我的发行版不支持。
答案 0 :(得分:8)
尝试这种方式:
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
或者,如果你想要可读的版本(没有单行):
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
这将按照正确的顺序重命名文件,然后重命名它们所在的目录。
答案 1 :(得分:0)
假设你有这个目录结构
/地方/ somethimg /
/地方/ somethimg / DIR1
/ somewhere / somethimg / dir1 / dir2
我认为你应该用dir2开始重命名,然后转到dir1,依此类推
答案 2 :(得分:0)
此脚本应首先在“leaf”中重命名当前路径中的所有文件/目录以使其正常工作。
#!/bin/bash
IFS=$'\n';
TMP=/tmp/file_list
rm -f ${TMP};
for file in `find .`
do
num=`echo $file | grep -o "/" | wc -l`;
echo "$num $file" >> ${TMP};
done
sort -n -r ${TMP} | cut -f 2 -d ' ' > ${TEMP}.temp;
for file in `cat ${TEMP}.temp`
do
echo $file;
## Code to rename file here. All subdirectories would already have been renamed
done