コンテンツにスキップ

Linux

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

apt: updateできない

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

1
2
3
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

リロード

  • ふつうのリロード: Ctrl+RまたはF5
  • 画像なども更新できるハード再読み込み: Ctrl]+Shift+RまたはShift+F5
  • キャッシュの消去とハード再読み込み
    • ショートカットキーはない.
    • F12キーを押してデベロッパーツールを呼び出してからツールバーにある [このページを再読込します] ボタンを右クリック, または長押しして表示されるメニューから機能を選択

curl

POSTのサンプル

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

ファイルのダウンロード

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

df, du: 容量チェック

1
df -h
1
du -h -d 1

ffmpeg

音声ファイル結合

1
ffmpeg -i in-1.mp3 -i in-2.mp3 -filter_complex "concat=n=2:v=0:a=1" out.mp3
  • -i 入力File名(必要数記載)
  • -filter_complex 複合フィルタ(ビデオ、オーディオ混合フィルタ定義)
  • concat=n=2:v=0:a=1
  • concat :動画・音声を連結するフィルタ定義
  • n :連結するファイル数(入力File名で指定した数を記載)
  • v :出力する映像ストリーム数
  • a :出力する音声ストリーム数

find

引数の順番

いつも忘れるので.

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

GPG

  • URL
  • まずgpg --gen-keyで基本的な設定を済ませる
  • パスフレーズによる暗号化
    • gpg -c <filename>
1
gpg -c .idm-db # Emacsからではなくターミナルから実行すること
  • 復号: gpg -d <filename>
1
gpg -d .idm-db.gpg > .idm-db

GPG ファイル暗号化

1
gpg -c ファイル名

GPG: 復号化

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

grep

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

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

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

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

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

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

nkf: UTF-8に一括置換

  • w: UTF-8
  • d: LF
1
grep -rl . | xargs nkf -wd --overwrite

OSのバージョン確認

  • Debian: cat /etc/debian_version
  • Ubuntu: cat /etc/lsb-release

PDFからの画像生成

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

PDFからの処理

  • PDF を準備する
  • PDF-XChange Viewer で PDF を開いて画像化する
  • 必要に応じて画像のファイル名をリネームする
  • 次のコマンドで結合
1
2
convert -append 画像1 画像2 画像3 出力画像
magick convert -append 画像1 画像2 画像3 出力画像
  • もしピクセルの制限で jpg が作れないなら png を作ってから適当な手段で jpg に変換する

scp: ディレクトリをコピー

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

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

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

sed: for Mac

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

sed: grep・findからのsed, Mac(zsh)でも使える

まとめ

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

自分用メモ

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

grep -lr "hoge" .

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

sed -i

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

sed: 中括弧の置換

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

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

sed: バックスラッシュの置換

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

このサイトを引用する.

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

参考コマンドは次の通り

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

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

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

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

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

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

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

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

sed: 一般的な注意

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

Ubuntu

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

  • https://www.virment.com/ubuntu-how-to-use-sshfs/
1
2
3
4
sudo apt-get update
sudo apt-get install sshfs

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

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

1
sudo umount remoteserver

zip

1
2
zip [オプション] アーカイブ ファイル名
zip -r hoge.zip hoge

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

1
2
3
4
5
6
find . -type d -empty -print0

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


find . -type d -empty -delete

シェルスクリプト

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

  • set -euは必須.
  • 空ではいけない変数は全て${BASEDIR:?}として書く
  • 変数は必ずダブルクォートで囲む
  • ファイルの列挙を取るのにアスタリスクは使わない

ワンライナーで乱数生成

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

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

シンボリックリンク作成: ln

  • URL
  • フォーマット: ln -s <実体ディレクトリ・ファイル> <シンボリックリンク名>
1
ln -s ~/dev/ASP.NET-Core/Database/doc/pgsql.a5er asp.net-core-database-pgsql.a5er
  • URL
  • フォーマット: unlink <シンボリックリンク名>
1
unlink asp.net-core-database-pgsql.a5er

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

  • df -h: ファイルシステムの容量チェック
  • du -d 1: あるディレクトリ配下の容量チェック

特定ディレクトリ配下で環境変数を自動設定

1
sudo apt install direnv
  • ~/.bashrcで次の設定
1
eval "${direnv hook bash}$"
  • 環境変数を設定したいディレクトリで.envrcを作り, 環境変数の定義を書く.
  • 例えば次のように設定を書く
    • Gitの設定を書く場合git config user.email "phasetr@gmail.com"などではうまくいかない点に注意する
1
2
3
export AWS_PROFILE=dev
export GIT_AUTHOR_NAME=phasetr
export GIT_AUTHOR_EMAIL=phasetr@gmail.com

パスワード生成

  • URL
  • pwgenをインストールして使えばよい
1
2
3
4
5
6
7
8
brew install pwgen


yum install pwgen

dnf install pwgen

apt-get install pwgen

ポートを占有しているアプリの特定と終了

  • URL
  • sudo lsof -i:<port>を実行
  • 出てきたプロセス番号を指定してkill <process-num>

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

  • sudo vim /etc/passwd で該当ユーザーの行を探して /home/xxx の部分を修正.