Я пытаюсь активировать набор файлов, содержащих пространство, с помощью оболочки FreeBSD /bin/sh:
user@host:~/temp/2011 $ find . | grep '03-11'
./01jan/ES 03-11.txt
./02feb/ES 03-11.txt
./03mar/ES 03-11.txt
./04apr/ES 03-11.txt
./05may/ES 03-11.txt
user@host:~/temp/2011 $ for i in `find . | grep '03-11'`; do echo "$i"; done
./01jan/ES
03-11.txt
./02feb/ES
03-11.txt
./03mar/ES
03-11.txt
./04apr/ES
03-11.txt
./05may/ES
03-11.txt
Пока я хотел бы получить:
user@host:~/temp/2011 $ find . | grep '03-11'
./01jan/ES 03-11.txt
./02feb/ES 03-11.txt
./03mar/ES 03-11.txt
./04apr/ES 03-11.txt
./05may/ES 03-11.txt
user@host:~/temp/2011 $ for i in `find . | grep '03-11'`; do echo "$i"; done
./01jan/ES 03-11.txt
./02feb/ES 03-11.txt
./03mar/ES 03-11.txt
./04apr/ES 03-11.txt
./05may/ES 03-11.txt
Что делать с пространством в этом случае?
Вам нужно установить IFS
на значение, которое не включает символ пробела.
Например:
(IFS=$'\n'; for i in `find . | grep '03-11'`; do echo "$i"; done)
Подробности смотрите на странице руководства .
Некоторые будут упорно бороться за «канонический способ Unix делать такие вещи»
find . -type f | grep '03-11' | xargs -I {} echo {}
Кстати, реализация xargs во FreeBSD не поддерживает -d\n
По какой-то неизвестной причине я никогда не использовал
xargs
, несмотря на то, что каждый раз, когда я вижу это, я думаю, что «это очень полезная команда».