在 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);
}
编译
替换Old
并New
使用引号\"
和双反斜杠\\
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