我有一个已生成的文件,其中包含MD5信息和文件名。我想从他们所在的目录中删除这些文件。我不确定如何准确地执行此操作。
filelist(file)包含:
MD5 (dupe) = 1fb218dfef4c39b4c8fe740f882f351a
MD5 (somefile) = a5c6df9fad5dc4299f6e34e641396d38
我的命令(我希望包含rm
)看起来像这样:
grep -o "\((.*)\)" filelist
返回:
(dupe)
(somefile)
*差不多好,虽然括号需要消除(不确定如何)。我尝试使用前瞻/外观使用grep -Po "(?<=\().*(?=\))" filelist
,但命令不起作用。
接下来我要做的是获取输出文件名并从它们所在的目录中删除它们。我不知道如何编写脚本,但它基本上会这样做:
<returned results from grep>
rm dupe $target
rm somefile $target
答案 0 :(得分:1)
您正在寻找的工具是xargs:http://unixhelp.ed.ac.uk/CGI/man-cgi?xargs 它在* nix系统上非常标准。
更新:鉴于目标等于文件所在的目录...
我相信语法看起来像:
yourgrepcmd | xargs -I{} rm "$target{}"
-I创建一个占位符字符串,grep命令中的每一行都插入到那里。
更新:
删除parens所需的步骤是使用sed的替换命令(http://unixhelp.ed.ac.uk/CGI/man-cgi?sed)
这样的事情:
cat filelist | sed "s/MD5 (\([^)]*\)) .*$/\1/" | xargs -I{} rm "$target/{}"
这里的故事的寓意是,如果你学习利用sed和xargs(或者如果你想要更高级的东西,那就是awk)你将成为一个更有能力的linux用户。
答案 1 :(得分:1)
如果我理解正确,你想采取这样的行
MD5 (dupe) = 1fb218dfef4c39b4c8fe740f882f351a
MD5 (somefile) = a5c6df9fad5dc4299f6e34e641396d38
提取没有括号的第二列以获取文件名
dupe
somefile
然后删除文件?
假设文件名没有空格,请尝试:
# this is where your duplicate files are.
dupe_directory='/some/path'
# Check that you found the right files:
awk '{print $2}' file-with-md5-lines.txt | tr -d '()' | xargs -I{} ls -l "$dupe_directory/{}"
# Looks ok, delete:
awk '{print $2}' file-with-md5-lines.txt | tr -d '()' | xargs -I{} rm -v "$dupe_directory/{}"
xargs -I{}
表示用{}替换参数(dupe filename),以便可以在更复杂的命令中使用它。