2013-11-22 2 views
1

Следующая Баш скрипт находит .txt файл из заданного пути каталога, а затем изменяет одно слово (изменение горы к морю) от .txt файлапуть к каталогу в качестве аргумента командной строки в Баше

#!/bin/bash 
FILE=`find /home/abc/Documents/2011.11.* -type f -name "abc.txt"` 
sed -e 's/mountain/sea/g' $FILE 

Выхода Я получение в этом случае в порядке. Моя проблема в том, что я хочу указать путь к каталогу как аргумент командной строки, тогда он не работает. Предположим, я изменить мой Баш скрипт для:

#!/bin/bash 
FILE=`find $1 -type f -name "abc.txt"` 
sed -e 's/mountain/sea/g' $FILE 

и вызывать его люблю:

./test.sh /home/abc/Documents/2011.11.* 

Ошибка:

./test.sh: line 2: /home/abc/Documents/2011.11.10/abc.txt: Permission denied 

Может кто-нибудь подскажет, как получить доступ путь к каталогу в качестве аргумента командной строки ?

+1

'./test.sh * .txt' заставит оболочку расширять этот шаблон до запуска test.sh, поэтому он будет функционально идентичен файлу' ./test.sh file1.txt file2.txt file3.txt etc ... ' –

ответ

2

Ваша первая линия должна быть:

FILE=`find "[email protected]" -type f -name "abc.txt"` 

Подстановочный будет расширен до вызова скрипта, поэтому вам нужно использовать "[email protected]", чтобы получить все каталоги, которые она расширяется, чтобы и передать их в качестве аргументов find ,

0

Вам не нужно передавать .* в ваш скрипт.

Есть сценарий, как это:

#!/bin/bash 

# some sanity checks here 
path="$1" 

find "$path".* -type f -name "abc.txt" -exec sed -i.bak 's/mountain/sea/g' '{}' \; 

И запустить его люблю:

./test.sh "/home/abc/Documents/2011.11" 

PS: Посмотрите, как СЭД может быть вызвана непосредственно из найти себя, используя -exec вариант.

+0

Имя каталога не' 2011.11', это '2011.11.10'. Ему нужен шаблон, чтобы найти каталог с любым суффиксом. – Barmar

+0

@ Бармар: Ах спасибо, я пропустил этот момент. Отредактировано сейчас. – anubhava

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