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

时间:2015-09-11 18:28:43

标签: linux hadoop hdfs dos2unix

我编写了一个shell脚本来在Windows 7中创建hdfs文件夹并在Linux服务器上运行。现在,hdfs文件夹已创建,但在名称末尾有特殊字符^ M(可能是回车)。它并没有出现在Linux中,但我可以看到它何时出现?输出重定向到文件。 我应该在运行此脚本之前运行dos2unix。但是现在我无法用^ M删除文件夹。有人可以协助如何删除这些文件夹。

2 个答案:

答案 0 :(得分:0)

有时候wildchar可能无效(rm filename *),最好使用下面的选项。

rm -r $(ls | sed '<LINE_NUMER>q;d')

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

答案 1 :(得分:0)

@SachinJ的补充答案。

TL; DR

$ 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目录

$ 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时,屏幕输出看起来还可以。

但是您无法选择

$ 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进行读取时,它显示如下所示

$ 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)等效于Windows \ r \ n(CRLF)

在Windows和Linux中编辑同一文件时,会发生此问题。

因此,我们只使用正确的文件名,然后就可以将其删除。但是不能从屏幕上复制它。

这里sed命令有效!

ls的输出如下

$ 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 select filename列,索引形式为1,因此列号为8。

所以只需编写命令

$ hdfs dfs -ls /path/to/dir/ | sed '5q;d' | awk '{print $8}'
/path/to/dir/dirtodelete

然后我们可以将其删除。

$ hdfs dfs -rm -r -f $(hdfs dfs -ls /path/to/dir/ | sed '5q;d' | awk '{print $8}')