如何重命名名称仅由不可打印字符组成的目录

如何重命名名称仅由不可打印字符组成的目录

在 SunOS 上,我有一些目录,其名称仅包含不可打印的字符。命令

ls -ldb *

返回以下内容(删除了一些空格)

drwxr-xr-x 3 user1 group1 3 Feb 4 18:10 \0122011\0122016\0122016\0122016\0122011\0122011\0122011\0122011\0122011\0122011\0122016\0122011\0122012/
drwxr-xr-x 3 user1 group1 3 Feb 4 11:03 \0122016\0122016/

如何重命名这些目录?

答案1

ls -ldb *(ksh, bash, zsh) 可以生成类似的文本$'...',如下所示:

echo $'\0122016\0122016'

这只是一堆换行符(Oct 012,十六进制 0x0A)和年份。

如果您可以使用的 shell 受到限制,请使用 printf :

printf '\0122016\0122016'

请注意,上面的代码不包括最后一个/.实际上不需要将目录名称提供给内核。

因此,要擦除,请使用:

rmdir "$(printf '\0122016\0122016')"

重命名使用:

mv "$(printf '\0122016\0122016')" newname

另一个文件将需要这个:

mv "$(printf '\0122011\0122016\0122016\0122016\0122011\0122011\0122011\0122011\0122011\0122011\0122016\0122011\0122012')" newname

或者,如果有不是其他具有相似名称、较短字符串的文件:

mv "$(printf '\0122011\0122016\0122016\0122016')"* newname

答案2

C/C++ 代码

#include<cstdio>

int main(){
 rename(Old,New);
}

编译

替换OldNew使用引号\"和双反斜杠\\

g++ -O3 -o bin file.cpp -D Old=\"\\0122016\\0122016/\" -D New=\"new\"

跑步

./bin

答案3

未经测试的伪代码:

i=1
for d in *
do
  echo "$d"
  echo Enter Y to rename the above directory:
  read answer
  if [ $answer = "Y" ]
  then
    mv "$d" tempdir${i}
    i=$((i+1))
  fi
done

相关内容