Ну, есть несколько способов сделать это (включая использование 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 реализовал их как встроенные модули.Есть много других способов получить префикс файла;однако это должно быть безопасно даже при наличии пробелов (табуляции, новых строк) в именах файлов или каталогов из-за осторожного использования двойных кавычек.