2012-06-18 2 views
0

Мне нужно найти все TIFF в каталоге, рекурсивно, но игнорировать некоторые артефакты (в основном все скрытые файлы), которые также заканчиваются словами« .tif ». Эта команда:bash `find` escaping

find . -type f -name '*.tif' ! -name '.*' 

работает именно так, как я хочу это в командной строке, но внутри сценария bash он ничего не находит. Я пробовал заменить ! на -and -not и - я думаю - почти каждая переходящая перестановка, о которой я могу думать и/или рекомендовал googleshpere, например. .\*, оставляя одинарные кавычки и т. Д. Очевидно, что я что-то пропускаю, любая помощь приветствуется.

EDIT: вот значительная часть скрипта; каталог, на котором выполняется поиск, параметризуется, но я отлаживаю его жестко закодированным; это не имеет никакого значения:

#!/bin/bash 
RECURSIVE=1 
DIR=$1 

#get the absolute path to $DIR 
DIR=$(cd $DIR; pwd) 

FIND_CMD="find $DIR -type f -name '*.tif' ! -name '.*'" 
if [ $RECURSIVE == 1 ]; then 
    FIND_CMD="$FIND_CMD -maxdepth 1" 
fi 

for in_img in $($FIND_CMD | sort); do 
    echo $in_img # for debugging 
    #stuff 
done 
+1

пожалуйста включает выписку из вашего сценария – pb2q

+0

вы звоните скрипт из каталога, который содержит '.tiff' файлов? –

+1

Каков рабочий каталог вашего скрипта? Вот где команда 'find' ищет файлы, соответствующие '* .tif'. – chepner

ответ

1

Это связано с тем, что выражение хранится в переменной. Решение заключалось в использовании eval, что, конечно же, было бы правильным решением. Все то же самое, что и выше, за исключением в начале для цикла:

for in_img in $(eval $FIND_CMD | sort); do 
    #stuff 
done 
+0

Я настоятельно рекомендую не использовать 'eval' таким образом, поскольку это может вызвать некоторые [действительно странные ошибки] (http://stackoverflow.com/questions/9308606/usr-bin-find-cannot-build-its-arguments -dynamically/9322047 # 9322047). Вам лучше хранить команду в массиве, как описано в этой ссылке (или вообще не хранить ее). Также см. [BashFAQ # 050] (http://mywiki.wooledge.org/BashFAQ/050). –

0

Чтобы не найти скрытые файлы, которые вы можете использовать следующее: (! в скобках)

find . \(! -regex '.*/\..*' \) -type f -name "*.tif" 

Он проверяет имя файла и не показывает файлы, начиная с dot, которые являются скрытыми файлами.

+0

Такая же проблема, хотя и спасибо за альтернативу. Я думаю, что это связано с тем, что я строю выражение и сохраняю его в переменной. – JStroop