2015-03-06 4 views
0

Я бегу следующую команду:ChDir в каталог с пробелами

cd $(find /tmp/my_temp/ -type d -wholename '/tmp/my_temp/MyNumb-*_WeCo - MX') 

возвращает somethingn как это:

/tmp/nolio_temp/MyNumb-15_WeCo - MX 

При попытке cd к этому выходу, я не могу, потому что есть пробелы.

Есть ли способ до cd в каталог, который возвращается find, хотя существуют пробелы?

+0

Цитата - правильная вещь, но если вы хотите только выполнить команду в этом каталоге, вы также можете выполнить команду -execdir. Затем вам нужно сопоставить любые файлы внутри каталога или ожидать, что они будут выполнены в родительском каталоге. – eckes

+0

Как вы хотите обработать случай, когда команда 'find' возвращает более одного результата? –

ответ

2

Просто процитирую его, и он будет работать:

cd "$()" 

В вашем случае:

cd "$(find /tmp/my_temp/ -type d -wholename '/tmp/my_temp/MyNumb-*_WeCo - MX')" 

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

+0

Есть ли способ сделать это, избегая символа двойной кавычки? Одиночные кавычки не работают –

+0

№ Одиночные кавычки не будут расширять выражение. – fedorqui

+0

Вы также можете избежать пробелов, но это выглядит чище. –

1

Это полный рот, но следующее дополнительное параноиком с точки зрения правильно работает в нечетных случаях угловыми:

IFS= read -r -d '' dirname \ 
    < <(find /tmp/my_temp/ -type d -wholename '/tmp/my_temp/MyNumb-*_WeCo - MX' -print0) 
cd "$dirname" 

Это будет обрабатывать имена файлов, оканчивающиеся на пробелы, имена файлов, содержащих символы новой строки (включая символ перевода строки, которые $() волевых есть), случаи, когда find возвращает только один результат и другие подобные странности.

0

В комментарии к fedorqui’s answer, вы написали, что хотите избежать использования двойных кавычек в своей команде. Я хотел бы знать, почему, но вы можете сделать это, в bash, по крайней мере, с

eval 'cd '$(find /tmp/nolio_temp -type d \ 
    -wholename '/tmp/nolio_temp/MyNumb-*_WeCo - MX' | 
    sed -e 's/ /\\ /g') 

Но будьте очень осторожны вредоносных файлов.

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