🤔
Linuxで特定のディレクトリ内のファイル名をもとに新しいファイルを作成する
MacOSで特定のディレクトリ内のファイル一覧を取得して、そのファイル名をもとにして新しいファイルを作成する必要があったのでその備忘録です。
例えばこんな感じでファイルがあったら、このディレクトリの中のファイルの拡張子を変えたものをコピーして作成します。
ディレクトリ
- hoge.txt
- fuga.txt
⬇⬇ 拡張子を書き換えたファイルを作成 ⬇⬇
別のディレクトリ
- hoge.md
- fuga.md
lsの出力結果をループ処理
ls
で出力したファイル名一覧はこんな感じでループ処理できます。
for filename in `ls ./dirname`; do
# 処理
done
置換して出力
ls
の結果を置換して出力するためにはls ./dirname | sed -e s/置換対象の文字列/置換後の文字列/g
という感じで書きます。
例として「.txt」から「.md」に書き換えるならls ./dirname | sed -e s/\.txt/\.md/g
みたいな感じです。ひとつずつ書き換えしたうえで出力するなら下記みたいになると思います。
# `hoge.txt`と`fuga.txt`があるディレクトリを指して実行すると
for filename in `ls ./dirname | sed -e s/\.txt/\.md/g`; do
echo $filename
done
# hoge.md
# fuga.md
新しいファイルを作成
これだとまだ置換されたファイル名が出力されただけなので新しいファイル名でファイルを作成してみます。空のファイルを作成するならtouch
コマンドですね。
# `hoge.txt`と`fuga.txt`があるディレクトリを指して実行すると
for filename in `ls ./dirname | sed -e s/\.txt/\.md/g`; do
touch "./new_dirname/$filename"
done
# new_dirnameディレクトリ内に hoge.md と fuga.md が作られる
Linuxでも同じコマンドが使えるはずです。うーん、もっと簡単に書けるような気がします
Discussion
Bashであればファイル名展開とパラメーター展開を使うと比較的シュッとかけるかなと思います。
Zshなどについてもおそらく同様の機能はあるかなと思います。
ご参考までに。
例:
なんと、こんなに簡潔に書けるのですね❗ありがとうございます❗
私ならループ使うと混乱するからtxtあるディレクトリで
こうかな
touchコマンド使ってたので空ファイルにしてますがコピーしたファイルそのままでいいなら
truncateコマンドは不要です
曲芸としてはかなり微妙だけど, 供養代わりに.
sed
とxargs -I% sh -c '%'
によるループなしのワンライナー.つまり,
sed
で実行するコマンドを組み立てて,xargs
でそれを実行している.sed
のパートで同様に1行で書けるなら任意の処理ができるんじゃないかな.