首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除名称中含有windows特殊字符(^M)的HDFS文件夹

如何删除名称中含有windows特殊字符(^M)的HDFS文件夹
EN

Stack Overflow用户
提问于 2015-09-12 02:28:43
回答 2查看 1.1K关注 0票数 0

我编写了一个shell脚本来在windows7中创建hdfs文件夹,并在Linux服务器上运行。现在,创建了hdfs文件夹,但名称末尾有特殊字符^M (可能是回车符)。它不会在Linux中显示,但我可以看到'ls‘输出何时被重定向到一个文件。我应该在运行这个脚本之前运行dos2unix。但是,现在我无法使用^M删除文件夹。有人可以帮助我删除这些文件夹吗?

EN

回答 2

Stack Overflow用户

发布于 2019-08-22 13:51:47

只是对o @SachinJ的补充回答。

TL;DR

代码语言:javascript
复制
$ hdfs dfs -rm -r -f $(hdfs dfs -ls /path/to/dir | sed '<LINE_NUMBER>q;d' | awk '{print $<FILE_NAME_COLUM_NUMBER>}')

应替换为您要在hdfs dfs -ls /path/to/dir输出中删除的文件的行号。

下面是一个示例。

详细信息

假设您的hdfs目录如下

代码语言:javascript
复制
$ hdfs dfs -ls /path/to/dir
Found 5 items
drwxr-xr-x   - test supergroup          0 2019-08-22 10:41 /path/to/dir/dir1
drwxr-xr-x   - test supergroup          0 2019-07-11 15:35 /path/to/dir/dir2
drwxr-xr-x   - test supergroup          0 2019-07-05 17:53 /path/to/dir/dir3
drwxr-xr-x   - test supergroup          0 2019-08-22 11:28 /path/to/dir/dirtodelete
drwxr-xr-x   - test supergroup          0 2019-07-26 11:07 /path/to/dir/dir4

当你从它ls时,屏幕输出看起来还可以。

但是你不能选择它

代码语言:javascript
复制
$ hdfs dfs -ls /path/to/dir/dirtodelete
ls: `/path/to/dir/dirtodelete': No such file or directory

$ hdfs dfs -ls /path/to/dir/dirtodelete*
ls: `/path/to/dir/dirtodelete*': No such file or directory

此外,在将ls结果输出到文件并使用vim读取时,显示如下

代码语言:javascript
复制
$ hdfs dfs -ls /path/to/dir > tmp

$ vim tmp
Found 5 items
drwxr-xr-x   - test supergroup          0 2019-08-22 10:41 /path/to/dir/dir1
drwxr-xr-x   - test supergroup          0 2019-07-11 15:35 /path/to/dir/dir2
drwxr-xr-x   - test supergroup          0 2019-07-05 17:53 /path/to/dir/dir3
drwxr-xr-x   - test supergroup          0 2019-08-22 11:28 /path/to/dir/dirtodelete^M^M
drwxr-xr-x   - test supergroup          0 2019-07-26 11:07 /path/to/dir/dir4

什么是"^M",它是回车符(CR)。更多信息here

Linux \n(LF) eq to Windows \r\n(CRLF)

在Windows和Linux中编辑同一文件时会出现此问题。

所以,我们只需要使用正确的文件名,然后我们就可以删除它,它不能从屏幕上复制。

这里sed命令起作用了!

ls输出如下

代码语言:javascript
复制
$ hdfs dfs -ls /path/to/dir
Found 5 items
drwxr-xr-x   - test supergroup          0 2019-08-22 10:41 /path/to/dir/dir1
drwxr-xr-x   - test supergroup          0 2019-07-11 15:35 /path/to/dir/dir2
drwxr-xr-x   - test supergroup          0 2019-07-05 17:53 /path/to/dir/dir3
drwxr-xr-x   - test supergroup          0 2019-08-22 11:28 /path/to/dir/dirtodelete
drwxr-xr-x   - test supergroup          0 2019-07-26 11:07 /path/to/dir/dir4

文件名在第5行,因此hdfs dfs -ls /path/to/dir | sed '5q;d'将删除我们需要的行。sed '5q;d‘表示读取前5行并退出,删除以前的行,因此它选择第5行。

然后我们可以使用awk选择文件名列,索引形式为1,因此列号为8。

所以只需编写命令

代码语言:javascript
复制
$ hdfs dfs -ls /path/to/dir/ | sed '5q;d' | awk '{print $8}'
/path/to/dir/dirtodelete

然后我们就可以删除它了。

代码语言:javascript
复制
$ hdfs dfs -rm -r -f $(hdfs dfs -ls /path/to/dir/ | sed '5q;d' | awk '{print $8}')
票数 1
EN

Stack Overflow用户

发布于 2015-09-12 23:15:18

有时通配符可能不起作用( rm filename* ),最好使用以下选项。

代码语言:javascript
复制
rm -r $(ls | sed '<LINE_NUMER>q;d')

替换为ls命令输出中的行号。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32529952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档