ファイル名のフルディレクトリパスをファイルに入れたいです。
したがって、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
2つのうちの1つです。変更中のファイルは、特定のタイプのリポジトリーにある必要があり、変更が期待どおりに機能しているかどうかがわかります。そうでない場合は、復元コマンドを使用してロールバックできます。