[Mac] テキストファイルのファイル名を1行目に書き込む

テキストファイルのファイル名をそのテキストファイル自身の1行目に書き込む作業をする必要が出てきたのでやってみた。

環境:macOS Catalina 10.15.2

(1)GNU sed をインストールする。

$ brew install gnu-sed

(2)cd で対象ディレクトリへ移動。

(3)単一のファイル(今回は「あいう.txt」とする)に対して、ファイル名を1行目に書き込むには以下。

$ gsed -i -e "1i `basename あいう.txt .txt`" あいう.txt

ただし、フォイル名に半角スペースを含む場合(「あいう かきく.txt」)は、半角スペースの前に \ が必要となる。

$ gsed -i -e "1i `basename あいう\ かきく.txt .txt`" あいう\ かきく.txt

もし対象ディレクトリ内すべてのテキストファイルに対して実行するなら以下のようにする。

(1')GNU sed をインストールする。

$ brew install gnu-sed 

(2')cd で対象ディレクトリへ移動。

(3')以下のコマンドでファイルリスト(list)を作る。

$ ls -1 *.txt > list

(4')以下のようなシェルスクリプトを作り、hoge.sh というファイル名で保存する。

#!/bin/bash
while read line
do
 echo $line
 gsed -i -e "1i $line" $line
done < list

(5')4’ を実行する。

$ sh hoge.sh

ただこれもファイル名に半角スペースがあると以下のようなエラーが表示される。

gsed: can't read 〇〇〇〇: No such file or directory

まあ、最初に半角スペースを適当な記号(★など)に置換してから実行すればいいんだけど、ワンライナーでディレクトリ内のテキストファイルに対して一気に実行できるコマンドがないかなあ。。。

参考:
apt - How do I insert a line at the top of a text file using the command line? - Ask Ubuntu
https://askubuntu.com/questions/151674/how-do-i-insert-a-line-at-the-top-of-a-text-file-using-the-command-line

入力と出力 | UNIX & Linux コマンド・シェルスクリプト リファレンス
https://shellscript.sunone.me/input_output.html

How to get only filename using sed - Unix & Linux Stack Exchange
https://unix.stackexchange.com/questions/44735/how-to-get-only-filename-using-sed

ある文字列をファイルの特定行に挿入するコマンド - 元RX-7乗りの適当な日々
https://www.na3.jp/entry/20110310/p1

Sedで1行追加 - JanGaJan.com
https://jangajan.com/blog/2014/09/09/sed-insert-text/

MacとLinuxでは、sedの動作が異なるので注意 | ITを使っていこう
https://it-ojisan.tokyo/mac-linux-sed/

シェルの入出力制御あれこれ - Qiita
https://qiita.com/tag1216/items/7ce35b7c27d371165e56

標準出力をシェル変数に入れたい - Qiita
https://qiita.com/netudra/items/f11b4922289c071290be

echoコマンドの詳細まとめました【Linuxコマンド集】
https://eng-entrance.com/linux-command-echo

find/xargsを使ったファイル・ディレクトリ名の一括置換/一括作成コマンド一覧
https://uguisu.skr.jp/Windows/find_xargs2.html

Add a variable defined after the first line of a text file - codesd.com
https://www.codesd.com/item/add-a-variable-defined-after-the-first-line-of-a-text-file.html

bash - osx find exec rm find: exec: unknown primary or operator - Stack Overflow
https://stackoverflow.com/questions/27915657/osx-find-exec-rm-find-exec-unknown-primary-or-operator

ファイル名などを抽出するbasenameコマンドの使い方まとめ【Linuxコマンド集】
https://eng-entrance.com/linux-command-basename

この記事が気に入ったらサポートをしてみませんか?