Проблема Список файлов в bash с пробелами в пути к каталогу

При вводе каталога в командную строку это:

ls -d -1 "/Volumes/Development/My Project/Project"/**/* | grep \.png$

Выводит список всех файлов, оканчивающихся на .png.

Однако, когда я пытаюсь создать скрипт:

#! /bin/bash

clear ;

# Tempoary dir for processing
mkdir /tmp/ScriptOutput/ ;

wdir="/Volumes/Development/My Project/Project" ;

echo "Working Dir: $wdir" ;

# Get every .PNG file in the project
for image in `ls -d -1 "$wdir"/**/* | grep \.png$`; do
...    
done

Я получаю сообщение об ошибке:

cp: /Volumes/Development/My: No such file or directory

пробел вызывает проблему, но я не знаю почему?


person Richard Stelling    schedule 01.08.2011    source источник


Ответы (4)


Другой вариант - изменить IFS:

OLDIFS="$IFS"  # save it
IFS="" # don't split on any white space
for file in `ls -R . | grep png`
do 
    echo "$file"
done
IFS=$OLDIFS # restore IFS

Узнайте больше о IFS в man bash.

person Michał Šrajer    schedule 01.08.2011

Используйте больше кавычек и не анализировать ls вывод.

for image in "$wdir"/**/*.png; do
person l0b0    schedule 02.08.2011

Если вы согласны с использованием while read и подпроцесса, созданного каналом, вы можете:

find . -name '*.png' | while read FILE
do 
    echo "the File is [$FILE]"
done
person Michał Šrajer    schedule 01.08.2011
comment
Вы могли бы даже 'find . -name '*.png' -exec echo {} \;'. Параметр -exec для поиска можно использовать много раз, если это необходимо. - person jfg956; 01.08.2011
comment
Правильно - для одной команды (например, echo) лучше всего использовать -exec (или |xargs для лучшей производительности, если файлов много). Для более чем одной команды я предпочитаю цикл while. Мне легче читать. Ваше здоровье. - person Michał Šrajer; 01.08.2011

вы можете попробовать [[:space:]] вместо пробела

wdir="/Volumes/Development/My[[:space:]]Project/Project"

или выполните команду для преобразования одного пробела

wdir=`echo "$wdir" | sed 's/[[:space:]]/\[[:space:]]/g'`
person Yajushi    schedule 01.08.2011