2012-06-28 1 views
0

В моем каталоге у меня есть вложенные папки, и я хочу, чтобы перечислить все каталоги, как это:избежать одиночных кавычек в длинном имени каталога затем передать его xargs [Bash 3.2.48]

- ./subfolder 
- ./subfolder/subsubfolder1 
- ./subfolder/subsubfolder2 
- ./subfolder/subsubfolder2/subsubsubfolder 

Я хочу, чтобы перечислить этот структура:

./fol'der/subfol'der/ 

Вот мой код:

echo -n "" > myfile 
find . -type d -print0 | xargs -0 [email protected] | cat | grep -v -P "^.$" | sed -e "s/'/\\\'/g" | xargs [email protected] echo "- @" >> myfile 

нужный результат будет выглядеть так:

- ./fol'der 
- ./fol'der/subfol'der 

Но выход:

- ./fol'der 
- @ 

Похоже sed терпит неудачу на втором наступлении одинарные кавычки (') характер, или что-то. Понятия не имею. Вы можете мне помочь? (Я нахожусь на OS X 10.7.4.)

+0

Те означало быть образцы, о каталогах с помощью специальных символов. – szantaii

+0

Возможно, вы могли бы упростить ввод и вывод вашего примера, и людям было бы намного легче следовать. –

+0

@DennisWilliamson Вы совершенно правы. Вчера вечером я очень устал. – szantaii

ответ

1

Я был grep -ing и sed -инг как идиот. Подумал немного, и я придумал гораздо более простое решение - цикл 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 
0

С GNU Параллельно вы можете сделать:

find . -type d -print0 | parallel -q -0 echo '- '{} 

Ваш выход будет испорчен, если у вас есть какие-либо директории с \ n в его имени. Если у вас нет каких-либо директорий с \ п в названии вы можете сделать:

find . -type d -print | parallel -q echo '- '{} 

Параметр -q только необходим, если вы действительно нужны два пробела после «-».

Вы можете установить GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel 
chmod 755 parallel 
cp parallel sem 

Смотреть интро видео для GNU Parallel, чтобы узнать больше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

0

Это на Linux, но она должна работать на OS X:

find . -type d -print0 | xargs -0 -I @ echo '- @' 

Это работает для меня независимо от того, является ли последний набор котировок единым или двойным.

Выход:

- ./fol'der 
- ./fol'der/subfol'der