【问题标题】:UNIX rename files/directories to uppercaseUNIX 将文件/目录重命名为大写
【发布时间】:2011-05-15 04:37:02
【问题描述】:

我正在尝试使用 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,因为我的发行版不支持它。

【问题讨论】:

标签: shell


【解决方案1】:

试试这个方法:

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

这将按照正确的顺序重命名文件,然后是它们所在的目录。

【讨论】:

  • 您需要引用所有 $(FOO) 和$FOO,如“$(FOO)”和“$FOO”。
  • @Teddy:你说得对,我有 2 个 $LONG 需要引用。现在已经修好了。我想我没有错过任何一个。
  • 这行得通。请注意,如果$LONG${DIR}/${SHORT} 匹配,mv 将抛出错误。对于未来的绊脚石,添加比较检查将解决此问题。
  • 那里,修复了它,所以如果名称已经 100% 大写,您就不会收到错误消息。
  • @Baramin:不,您仍然需要将所有 $( foo bar baz ) 引用为“$( foo bar baz )”。
【解决方案2】:

这个脚本应该重命名当前路径中的所有文件/目录在“叶”的第一顺序,以使事情正常。

#!/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

【讨论】:

  • +1 用于附加示例。我没有彻底测试它,但它似乎工作。不过,您确实需要将 $TEMP 更改为 $TMP
  • 这将阻塞包含特殊字符(空格,\[*?)的文件名。由于临时文件的使用不安全,它也不是生产就绪的。首先,始终在变量替换 ($var) 和命令替换 (`command`) 周围使用双引号。使用find -exec,这就是它的用途。排序步骤没用,请阅读find -depth
  • 是的,不知道 -depth 选项。
【解决方案3】:

假设你有这个目录结构
/某处/某事/
/somewhere/somethimg/dir1
/somewhere/somethimg/dir1/dir2

我认为你应该从 dir2 开始重命名,然后转到 dir1 等等

【讨论】:

  • 这将是一个深度优先搜索,它没有像我的问题中提到的那样工作。