Linux

Linux のコマンドメモなどをまとめます.

apt

updateできない

例えば次のようなエラーが出たとき.

E: The repository 'http://ppa.launchpad.net/kelleyk/emacs/ubuntu jammy Release' does not have a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.

とりあえず/etc/apt/sources.listに記述がないか確認する. そこになければ/etc/apt/sources.list.d/にいくつかファイルがあるはずで, その中のファイルを調べる. 上のメッセージが出たときはkelleyk-ubuntu-emacs-jammy.listdeb http://ppa.launchpad.net/kelleyk/emacs/ubuntu jammy mainがあり, これをコメントアウトして再度sudo apt updateしたら動いた.

Chrome

リロード

curl

POSTのサンプル

curl -X POST -H "Content-Type: application/json" \
     -d '{"Name":"sensuikan1973", "Age":"100"}' \
     localhost:8080/api/v1/users

ファイルのダウンロード

curl -OL <URL>
curl -OL https://www.intro-to-computation.com/code/Chap03_simple_computations.hs

df, du: 容量チェック

+BEGIN_SRC sh :results output

df -h

+END_SRC

+BEGIN_SRC sh :results output

du -h -d 1

+END_SRC

sed (for Mac)

+BEGIN_SRC sh

sed -i "" 's/フォンノイマン/フォン・ノイマン/g' math_expedition.org sed -i "" 's/フォンノイマン/フォン・ノイマン/g' math_tour.org

+END_SRC

+RESULTS:

GPG

ffmpeg

音声ファイル結合

ffmpeg -i in-1.mp3 -i in-2.mp3 -filter_complex "concat=n=2:v=0:a=1" out.mp3

find

引数の順番

いつも忘れるので.

find 検索先ディレクトリ -name ファイル名

GPG ファイル暗号化

gpg -c ファイル名

GPG: 復号化

gpg --output .idm-db --decrypt .idm-db.gpg

grep

拡張子で対象ファイルを絞る

--include オプションを使う.

grep -r --include='*.html' <検索キーワード> <対象ディレクトリ>
grep -A 2 --include="*.org" -rn "Пусть" .

該当行の上下も一緒に表示する

後ろの行が見たい場合は -A, 前の行が見たい場合は -B オプションを使う.

grep -r -A 10 hoge ./
grep -A 2 -rn "Пусть" "./free_docs"

OSのバージョン確認

PDFからの画像生成

事前準備: ツールのインストール

PDFからの処理

convert -append 画像1 画像2 画像3 出力画像
magick convert -append 画像1 画像2 画像3 出力画像

scp

ディレクトリをコピー

ディレクトリコピー自体は -r オプションでいける.

scp -r コピー元 コピー先
scp -r dir/ username@hostname:/path/to

コピー元のディレクトリは dir/ とスラッシュをつけないといけない気がした: 要確認. いきなり巨大なディレクトリで実行する前に小さなテストディレクトリで試すこと. 行き先のディレクトリも小さなファイル送信でテストすること.

sed

grep・findからのsed

参考文献

結論

_black が置換したかった文字列.

grep -lr "_black" . | xargs sed -i -e "s/target=_black/target=_blank/g"

やりたかったこと

ファイルをまたいだタイポを大量に見つけたので修正したい. grepfind で検索した上で sed をかませて処理したい.

grep -lr "hoge" .

ここでの(個人的)ポイントは -l オプション. これでファイル名だけ出力できる. find はふだんあまり使わず引数の順番を間違えてよく怒られるので, grep で処理できると便利

sed -i

-i オプションが指定ファイルを書き換えてくれるオプション. 便利.

中括弧の置換

シングルクオートでくくってバックスラッシュでエスケープする.

find "charged_docs/lang/einstein-sr/reading" -name "*.org" | xargs sed -i -e 's/}//g'

バックスラッシュの置換

正規表現をシングルクオートでくくるかダブルクオートでくくるかで変わる. シングルクオートでくくった方がよさそう.

このサイトを引用する.

  • 正規表現を'(シングルクォート)でくくる場合、置換文字列「\\」がシェル展開されずにsedに伝わる。sedは「\\」を「\」と解釈し、結果を表示する。
  • 正規表現を"(ダブルクォート)でくくる場合、置換文字列「\\\\」はシェル展開されて「\\」に変わる。sedは「\\」を「\」と解釈し、結果を表示する。 なお、「\\\」をシェル展開しても「\\」になる。「\\\\\」をシェル展開すると「\\\」に変わる。この挙動はしっくりこないが、基本的に「\\\\」を「\\」に展開する方針を採った方が分かりやすいだろう。

参考コマンドは次の通り

grep -rl "\\guillemotleft " . | xargs sed -i -e 's/\\guillemotleft /«/g'
grep -rl "\\guillemotright" . | xargs sed -i -e 's/\\guillemotright/»/g'

ピリオド(ドット)の置換

[\.] で置換用の検索をかける.

grep -rl "\.\}" charged_docs/lang/einstein-sr/reading/ | xargs sed -i -e 's/[\.]\}/./g'

マッチした文字列を置換で使う

例えば \emph{some words}**some words** と置換したいときに some words を置換後にそのまま取り回したい状況を考えている. 結論を言えば置換したい文字列で \1, \2 などを指定すればいい,

find "./charged_docs/lang/einstein-sr" -name "*.org" | xargs sed -i -e 's/\\emph{\(.*\)}/\*\*\1\*\*/g'

検索対象の文字列でマッチする部分の丸括弧はエスケープする必要があるので注意すること.

一般的な注意

Mac と Linux でコマンドオプションに違いがある. Mac でも Linux のコマンドを使える方法があったと思うので, そのうち記録する.

Ubuntu

サーバー上のディレクトリをマウントする

sudo apt-get update
sudo apt-get install sshfs

sshfs username@mf-storage-01.itmz153.net:/home/username/ ~/remoteserver -p 12322

アンマウントは次の通り.

sudo umount remoteserver

空ディレクトリの検出と削除

find . -type d -empty -print0

find . -type d -empty -print0 | xargs -0 -r -n 1 rmdir


find . -type d -empty -delete

シェルスクリプト

書くときの注意: 事故を起こさないために

ワンライナーで乱数生成

Ruby のワンライナーは知っているもののもうインストールしておらず, いつも入れている Python のワンライナーでうまいこと多数の乱数が作れなかったので代替です. 簡単なパスワードを作るときに使えます.

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 5 | head -n 20 | sort | uniq

ディレクトリ容量チェック

ホームディレクトリの変更