在长目录名中转义单引号,然后将其传递给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您完全正确。昨晚我很累。