背景
一个目录可以包含N个子目录。每个子目录包含多个要解压的.rar 文件。
〜/ mydir / Data 1〜/ mydir / Data2 ...〜/ mydir / DataN
注意“i”和“r”以及“a”和“1”之间的空格
目标
从命令行发出单个命令来 Unzip.rar 文件并将文件保留在原始 .rar 目录中(不要创建新目录)。
我的第一个想法是递归地构建 .rar 文件的列表,直接输出:
查找主页/用户/mydi\ r/Data\ 1 | grep.rar
进入xargs
并解压:
unrar e -r /home/user/mydi\ r/Data\ 1/myfile.rar
问题
能否xargs
正确处理目录和文件名中的空格字符,没有\
字符?
我怀疑目录和 .rar 文件名中的空格字符导致错误:
find /home/user/Desktop/ -name "*Har*.rar" | xargs -d '\n' unrar e -r
因为unrar
期望在空格字符之前有一个 '\':
/home/user/mydi\ r/Data\ 1/myfile.rar
返回的错误: No files to extract
如有任何诊断问题或建议,我们将不胜感激。
答案1
这就是为什么 GNUfind
有一个-print0
选项,GNUxargs
有一个-0
选项:这些选项导致find
用 ASCII 字符分隔文件名NUL
,并导致xargs
查找NUL
字符来分隔输入参数。这使您可以正确处理包含空格的文件名。
例如:
find /home/user/Desktop -name '*.rar' -print0 | xargs -0 -n1 unrar e -r
我们需要该-n1
标志,xargs
因为unrar e
期望命令行上有一个存档。