在长目录名中转义单引号,然后将其传递给xargs[Bash 3.2.48]
在我的目录中,我有子文件夹,我想列出所有目录,如下所示:在长目录名中转义单引号,然后将其传递给xargs[Bash 3.2.48],bash,sed,awk,pipe,xargs,Bash,Sed,Awk,Pipe,Xargs,在我的目录中,我有子文件夹,我想列出所有目录,如下所示: - ./subfolder - ./subfolder/subsubfolder1 - ./subfolder/subsubfolder2 - ./subfolder/subsubfolder2/subsubsubfolder - ./fol'der - ./fol'der/subfol'der 我想列出此结构: ./fol'der/subfol'der/ 这是我的密码: echo -n "" > myfile
- ./subfolder
- ./subfolder/subsubfolder1
- ./subfolder/subsubfolder2
- ./subfolder/subsubfolder2/subsubsubfolder
- ./fol'der
- ./fol'der/subfol'der
我想列出此结构:
./fol'der/subfol'der/
这是我的密码:
echo -n "" > myfile
find . -type d -print0 | xargs -0 -I@ | cat | grep -v -P "^.$" | sed -e "s/'/\\\'/g" | xargs -I@ echo "- @" >> myfile
所需的输出如下所示:
- ./subfolder
- ./subfolder/subsubfolder1
- ./subfolder/subsubfolder2
- ./subfolder/subsubfolder2/subsubsubfolder
- ./fol'der
- ./fol'der/subfol'der
但结果是:
- ./fol'der
- @
似乎在第二次出现单引号(“
)字符时,sed
失败,或者其他什么。我不知道。你能帮助我吗?(我在OS X 10.7.4上。)我一直像个白痴一样grep
-ing和sed
-ing。考虑了一下,我想出了一个更简单的解决方案,for循环
echo -n "" > myfile
for folder in $(find . -type d)
do
if [[ $folder != "." ]]
then
echo "- ${folder}" >> myfile
fi
done
我以前的解决方案不适用于包含空格的名称,因此正确的解决方案是:
echo -n "" > myfile
find . -type d -print0 | while read -d $'\0' folder
do
if [[ "${folder}" != "." ]]
then
echo "- ${folder}" >> myfile
fi
done
使用GNU Parallel,您可以执行以下操作:
find . -type d -print0 | parallel -q -0 echo '- '{}
find . -type d -print | parallel -q echo '- '{}
如果有任何名称中带有\n的目录,则输出将出错。如果名称中没有任何带\n的目录,则可以执行以下操作:
find . -type d -print0 | parallel -q -0 echo '- '{}
find . -type d -print | parallel -q echo '- '{}
只有在“-”之后确实需要两个空格时才需要-q
您可以通过以下方式安装GNU并行:
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
观看GNU Parallel的介绍视频以了解更多信息:这是在Linux上,但它应该可以在OS X上运行:
find . -type d -print0 | xargs -0 -I @ echo '- @'
无论最后一组引号是单引号还是双引号,它都适用于我
输出:
- ./fol'der
- ./fol'der/subfol'der
这些都是关于使用特殊字符的目录的示例。您可以简化您的示例输入和输出,人们会发现它更容易理解。@DennisWilliamson您完全正确。昨晚我很累。