我想将文件名的完整目录路径放入文件中。
因此,如果存在 foo/bar/main.cpp,则该路径将添加到文件 main.cpp 的顶部。
任何人都可以帮我使用 bash 命令吗?
我尝试了所有 find 、 exec 和 xargs 方法,但是执行 echo 或 cat 为我提供了文件的内容,而不是文件名本身。也许答案会清楚地说明如何从 find exec 或任何其他方法中提取文件名。
文件 /foo/bar/main.cpp 中的预期输出
///foo/bar
int main ( .... ) {
}
答案1
您可以使用这样的脚本:
#!/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
它接受绝对路径和相对路径,并且您可以混合使用它们,如示例中所示。
请注意,没有撤消功能! :-)
答案2
如果您使用 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: {}' {} +
技巧是{}
可以在 find 的 exec 参数中多次使用。
我正在修剪.hg
,假设这是在水银存储库中。这可以是.git
或其他。您正在修改的文件应该位于某种类型的存储库中,以便您可以知道更改是否按预期工作,如果没有,您可以使用恢复命令回滚。