[[
] это не функция POSIX, а ksh88
.
Если вы хотите узнать, что происходит, вам нужно прочитать документацию по ksh.
Поскольку вы, похоже, заинтересованы в понимании функции [[
], вам нужно знать, что [[
- это не встроенная команда, как [[
, а часть синтаксиса оболочки, поэтому ее рабочая база полностью отличается от команды test
.
По этой причине, например, [[ $var == *test? ]]
не нужно заключать шаблон справа в кавычки.
Можно использовать такой скрипт:
#!/usr/bin/env bash
for i; do
if [ "${i:0:1}" = "/" ]; then
# Absolute path
sed -i "1i${i}" "${i}"
else
# Relative path
sed -i "1i${PWD}/${i}" "${i}"
fi
done
В качестве позиционных параметров принимает любое количество файлов, в которых будет прописан абсолютный путь, т.е. можно вызывать так:
./addPath foo/bar.cpp foo/bar/main.cpp /home/user/main.cpp
Он принимает абсолютные и относительные пути, и вы можете смешивать их, как вы можете видеть в примере.
Будьте осторожны, функция отмены недоступна! :-)
Если вы используете gnu find/sed, это должно работать:
cd /
find subpath_with_files -name.hg -prune -o -type f -exec sed -i -e '1i\{}' {} +
Если вы хотите добавить это как комментарий, вы можете использовать что-то вроде этого:
cd /
find subpath_with_files -name.hg -prune -o -type f -exec sed -i '1i\# Filename: {}' {} +
Хитрость в том, что {}
можно использовать более одного раза в параметре exec команды find.
Я обрезаю .hg
, предполагая, что это находится в ртутном репозитории. Это может быть .git
или другое. Файлы, которые вы изменяете, должны находиться в каком-либо репозитории, чтобы вы могли знать, что изменение сработало должным образом, и вы можете откатиться с помощью команды возврата, если это не так.