2013-03-25 1 views
2

Я пытаюсь использовать «find» для выполнения команды на кучу файлов HTML, а затем вывести результат в другой каталог. Тем не менее, труба терпит неудачу, потому что имя файла, найденное с помощью «find», включает в себя путь, и путь не соответствует структуре каталогов цели канала. По существу мне нужно удалить путь из второго экземпляра {} ниже.Стрип-путь от find для использования в трубе

find subd/*.html -type f -exec "./mycmd {} opts > subd2/{}" \; 

Это упрощенная версия команды, но в реальном мире, положив «../» перед mysubdirectory2 не будет работать, а также не префиксы „CD & & СУБД“.

ответ

0

Хорошо, я нашел решение, в конце концов, который должен был использовать одинарные кавычки, а не двойные кавычки, и использовать форму оценки $() для базового имени:

find subd/*.html -type f -exec './mycmd {} opts > subd2/$(basename {})' \; 

Я понятия не имею, почему одиночные кавычки - это разница или любая идея, почему решение Энди не работает на моей машине.

1

Время написать скрипт (назовем его mycmd-invoker), что делает «правильное задание» и запустить что из find:

find subd/*.html -type f -exec mycmd-invoker {} + 

Скрипт получает дан список имен файлов с пути и может иметь дело с вопросы:

for file in "[email protected]" 
do 
    base=$(basename "$file") 
    ./mycmd "$file" opts > subd2/"$base" 
done 

вы можете бросить mycmd-invoker сценарий далеко, как только вы закончите с задачей, если вы думаете, что вам может понадобиться, чтобы сделать это снова.

1

Нечто подобное должно работать:

while read fn 
do 
    ./mycmd "${fn}" opts > "subd2/${fn##*/}" 
done < <(find subd -type f -name "*.html") 
1
find subd/*.html -type f -exec "./mycmd {} opts > subd2/\`basename {}\`" \; 

Обновления: Добавлено ускользает до того, окружающие обратные кавычки базового имени

+0

Basename, похоже, не делает то, что я думаю, мы оба думаем, что это должно сделать в этом контексте. По какой-то причине он не выделяет путь. –

+1

В этом конкретном случае я думаю, что 'basename {}' запускается * перед * 'find', и его вывод (скорее пустой, но, возможно, сообщение об ошибке) заменяется на строку с двойными кавычками, что приводит к' find subd/* .html -type f -exec "./mycmd {} opts> subd2 /" \; ' – twalberg

+0

Очень хорошие моменты. Я обновил его, чтобы избежать обратных шагов, и в моем тестировании это рабочее решение. –

2

Аналогичны решением Джонатана, но удалить ненужный дополнительный сценарий.

find subd -name '*.html' -type f -exec sh -c ' 
    for f; do 
     ./mycmd "$f" opts > subd2/"${f##*/}" 
    done 
' _ {} '+' 
Смежные вопросы