Сценарий оболочки: выполнить cmd для файла, с дополнительной обработкой имени файла - PullRequest
0 голосов
/ 21 января 2011

Итак, я снова собираюсь опубликовать вопрос о сценариях оболочки.

Определение проблемы: Для всех файлов в каталоге, напр .:

  • A_anything.txt, B_anything.txt, ......

Я хочу выполнить сценарий, скажем 'CMD', для каждого из них с выходными файлами с именами, такими как:

  • A_result.txt, B_result.txt, ......

Кроме того, в первой строке этого выходного файла я хочу получить имя файла исходного.

Мне кажется, что утилита 'find -exec' не может извлечь часть имени файла.

Кто-нибудь знает решение этой проблемы каким-либо образом (shell, python, find и т. Д.)? Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 января 2011
cd /directory
for file in *.txt ; do
    newfilename=`echo "$file"|sed 's/\(.\+\)_.*/\1_result.txt/`
    echo "$file" > "$newfilename" 
    your-command $file >> "$newfilename"
done

HTH

1 голос
/ 21 января 2011

Ну, есть несколько способов сделать это (включая использование Perl, где это девиз), но, вероятно, я бы написал так:

find . -name '[A-Z]_*.txt' -type f -print0 |
    xargs -0 modify_rename.sh

А потом я бы написалscript modify_rename.sh примерно так:

#!/bin/sh
for file in "$@"
do
    dirname=$(dirname "$file")
    basename=$(basename "$file" .txt)
    leadname=${file%_*}
    outname="$dirname/${leadname}_result.txt"
    # Optionally check for pre-existence of $outname
    {
    # Optionally echo "$basename.txt" instead of "$file"
    echo "$file"
    # Does this invocation of CMD write to standard output?
    # If not, adjust invocation appropriately.
    CMD "$file"
    } > "$outname"
done

Преимущество этого разделения на отдельные операции сценариев заключается в том, что операцию переименования / изменения можно проверять отдельно от процесса поиска, что снижает риск извлечения всего содержимогоструктура каталогов с плохими командами.

В Bash есть инструменты, позволяющие избежать вызова basename и dirname, но запись умеренно мучительна;Я считаю, что ясность имен команд стоит иметь.Я был бы счастлив, если бы bash реализовал их как встроенные модули.Есть много других способов получить префикс файла;однако это должно быть безопасно даже при наличии пробелов (табуляции, новых строк) в именах файлов или каталогов из-за осторожного использования двойных кавычек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...