我编写了一个 shell 脚本来在 Windows 7 中创建 hdfs 文件夹并在 Linux 服务器上运行。现在,创建了 hdfs 文件夹,但名称末尾带有特殊字符 ^M(可能是回车)。它没有出现在 Linux 中,但我可以看到“ls”输出何时重定向到文件。我应该在运行这个脚本之前运行 dos2unix。但是现在我无法使用 ^M 删除文件夹。有人可以协助如何删除这些文件夹。
问问题
1198 次
2 回答
1
只是@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)。更多信息在这里
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}')
于 2019-08-22T05:51:47.463 回答
0
有时通配符可能不起作用( rm filename* ),最好使用以下选项。
rm -r $(ls | sed '<LINE_NUMER>q;d')
替换为 ls 命令输出中的行号。
于 2015-09-12T15:15:17.860 回答