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

标签 linux hadoop hdfs dos2unix

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

最佳答案

只是@SachinJ 的补充答案。

TL;博士

$ 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) eq 到 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选择文件名列,索引形式为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}')

关于linux - 如何删除名称中含有Windows特殊字符(^M)的HDFS文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529952/

相关文章:

hadoop - 将Hadoop作业的结果添加到Hive Table

java - 设置带有输入拆分的映射器的Hadoop数量不起作用

php - 使用 bash 或 php 获取文件夹层次结构

hadoop - 扫描 hbase 时 map task 卡住

hadoop flume 提取推特数据

python - 如何将文件从本地笔记本电脑放到远程HDFS?

hadoop - 在hadoop/pig中导入日志的多级目录

c++ - 在旧代码中以最少的更改创建基于类型的标识号

c - Makefile:链接 .*a 库

linux - 从另一台电脑到 docker 的隧道 ssh