2015-05-07 3 views
0

Я пытаюсь написать сценарий bash, который ищет файл в одном каталоге и заменяет его одним и тем же именем из исходного каталога. Когда я запускаю команду find, это, кажется, установив мой $path дваждыПолучение дублирующего вывода

for f in build-res/$1/*.png; do 
    file="$(basename "$f")" 
    echo "Looking for $file in $TMP" 
    path="$(find $TMP -type f -name "$file")" 
    if [[ -z $path ]]; then 
      echo "Could not find $file in $TMP" 
     else 
      echo "Replacing file at $path with $file" 
      echo "__path__" 
      echo $path 
      echo "---" 
     fi 
done 

Запуск одной итерации этого цикла выходов что-то вроде

Replacing file at tmp/trx//images/background/background_iphone5.png 
tmp/trx//images/background_iphone5.png with background_iphone5.png 
__path__ 
tmp/trx//images/background/background_iphone5.png tmp/trx//images/background_iphone5.png 
--- 

Обратите внимание, как путь повторяется с пространством между ними. Почему это происходит?

Другое примечание, почему оно возвращается с // на пути? Это, похоже, не проблема, тем более любопытная.

+1

Это не тот же путь дважды. Это два разных пути. –

+0

Двойной '//', вероятно, поступает непосредственно из значения 'TMP'; как он устанавливается? – chepner

+0

Возможно, вы захотите заменить «путь» на массив, 'path = ($ (find $ TMP -type f -name« $ file »)), который позволяет вам проверять количество возвращенных совпадений' [$ {# path [@]} -gt 1] && handle multiples ... ' –

ответ

4

Если присмотреться, это не тот же путь:

tmp/trx//images/background/background_iphone5.png tmp/trx//images/background_iphone5.png 

->

tmp/trx//images/background/background_iphone5.png 
tmp/trx//images/background_iphone5.png 

Это результат выход find, который находит 2 файла с одинаковым именем в разных подкаталогах от /tmp.

Просто FYI, если вы хотите контролировать, насколько глубоко find может спуститься в подкаталогах, есть возможность для этого:

-maxdepth уровни

Спускайтесь на большинстве уровней (неотрицательное целое число) уровни каталогов ниже аргументов командной строки. -maxdepth 0 означает только применить тесты и действия к аргументам командной строки.

Или, если вы хотите только один результат, который вы можете использовать

-quit

Выход немедленно. Никакие дочерние процессы не будут запущены, но не будет обработано больше путей, указанных в командной строке. Например, find /tmp/foo /tmp/bar -print -quit будет печатать только /tmp/foo.

+0

Наверное, мне просто нужен второй набор глаз, чтобы понять, что он находит больше одного файла -__-. Спасибо – Chris

+2

Правильно, это происходит со всеми нами =) – dekkard

Смежные вопросы