如何删除名称中包含windows特殊字符(^m)的hdfs文件夹

3yhwsihp  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(551)

我在Windows7中编写了一个shell脚本来创建hdfs文件夹,并在linux服务器上运行。现在,创建了hdfs文件夹,但名称末尾有特殊字符^m(可能是回车符)。它在linux中没有出现,但我可以看到“ls”输出何时被重定向到一个文件。我应该在运行这个脚本之前运行dos2unix。但是现在我无法用^m删除文件夹。有人能帮忙删除这些文件夹吗。

ar5n3qh5

ar5n3qh51#

只是对@sachinj的补充回答。
热释光;博士

$ 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)。更多信息请点击此处
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行,因此选择第5行。
然后我们可以使用awk选择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}')
pgky5nke

pgky5nke2#

有时wildchar可能不起作用(rm filename*),最好使用下面的选项。

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

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

相关问题