[Software Tips] bash
更新日:2022年10月29日(初版作成日:2020年10月31日)
- 当該ディレクトリ以下の全ソースファイル(*.cc)から、”xxx”と書かれている部分を探す方法
- ディレクトリツリーを書く方法
- 数値で構成されているファイルの大群から、特定のファイルを抜き出す方法
- あるファイル名を日付付きのファイル名に変更する方法
- S-JISのWindowsファイル(xxx.txt)をLinux系のUTF-8のファイル(yyy.txt)に変更する方法
- ファイル”xxx.txt”をUTF-8に変更する方法
- pngファイル群を一つのpdfに変換する方法
- ファイル名を一括変換する方法
- デバック情報の画面表示と同時にログも残す方法
- スタックサイズの変更方法
- pdfファイルから画像ファイルを抜き出す方法
- 実態ファイル(entity_file)からリンクファイル(link_file)を生成する(シンボリックリンクをはる)方法
- bmp画像から任意の位置のピクセル画像を抜き取る方法
- ディレクトリのサイズを調べる方法
- ffmpegを使った様々な動画処理方法
- ファイルを連続で開く方法
- 更新したファイルだけアップロードする方法
- 各種バージョン確認方法
- 改訂履歴
当該ディレクトリ以下の全ソースファイル(*.cc)から、”xxx”と書かれている部分を探す方法
% find . -type f -name ‘*.cc’ | xargs grep -i ‘xxx’
findの次の”.”は、カレントディレクトリの意味。
“-type f -name ‘*.cc'”で*.ccのファイルを探すの意味。
“-i”は、大文字小文字を区別しないの意味。
ディレクトリツリーを書く方法
% tree -L 3 -I ‘docs|zzz*|trash*’
(-I以下はignoreするファイル)
数値で構成されているファイルの大群から、特定のファイルを抜き出す方法
% ls 151001-1[0-9][02468]-17.png
3桁の先頭が”1″で、十の位は、任意の数、一の位は、偶数、2桁部分は”17″のファイル群を選択できる。
lsをrmやmvに変えれば色々できる。
あるファイル名を日付付きのファイル名に変更する方法
% mv xxx.pdf xxx`date ‘+%F’`.pdf
‘+%F’は、2022-07-24という表記の意味
月日だけなら、’+%m-%d’など、他にも細かく設定できる。詳細はここが分かりやすい。
“`”はシングルクオーテーションではなく、バックスラッシュ。
S-JISのWindowsファイル(xxx.txt)をLinux系のUTF-8のファイル(yyy.txt)に変更する方法
<81>@のような文字化けが出るときは、これで大丈夫のはずです。
% nkf -Lu -Sw xxx.txt > yyy.txt
-Lu: 改行コードの変更
-Sw: 入力がS-JISで、UTF-8への変換
ファイル”xxx.txt”をUTF-8に変更する方法
% nkf -w –overwrite xxx.txt
-w: UTF-8への返還
–overwrite: 上書き
pngファイル群を一つのpdfに変換する方法
% convert `ls -rt *.png` all.pdf
-rtは、時間順を逆順にするの意味、昔のファイルから順番にする。
“`”はシングルクオーテーションではなく、バックスラッシュ。
ファイル名を一括変換する方法
% rename ‘s/-0-/-2-/’ *.txt
(全てのファイル名中にある、’-0-‘を’-2-‘に変換する)
デバック情報の画面表示と同時にログも残す方法
% ./exe_file 2>&1 | tee log.txt
(bash用です)
スタックサイズの変更方法
% ulimit -s 50000
単位はkB、当該のシェルのみ有効
前後で、ulimit -aで確認
pdfファイルから画像ファイルを抜き出す方法
% pdfimages sample.pdf fig
“fig”は画像の接頭語になる、つまりfig-0000.xxx, fig-0001.xxx, fig-0002.xxx …
ここでxxxは、画像フォーマット(png、bmp、ppmなど)
pdfimagesは、xpdfのコマンド、xpdfが無い場合、brew install xpdf等でインストール
実態ファイル(entity_file)からリンクファイル(link_file)を生成する(シンボリックリンクをはる)方法
% ln -s entity_file link_file
entity_file:元のファイル
link_file:新しくできるシンボリックリンクファイル
bmp画像から任意の位置のピクセル画像を抜き取る方法
% convert input.bmp -crop 500×300+0+0 output.bmp
500がwidth(x座標)、300がy座標
ディレクトリのサイズを調べる方法
% du -sh ./directory_name
ffmpegを使った様々な動画処理方法
% ffmpeg -i xxx.mp4 (確認)
% ffprove xxx.mp4 (確認)
% ffmpeg -i xxx.3gp xxx.mp4 (フォーマット変換)
% ffmpeg -i xxx.flv xxx.mp4 (フォーマット変換)
% ffmpeg -i xxx.mp4 -vcodec copy -an xxx_out.mp4 (音声削除)
% ffmpeg -i xxx.mp4 -vcodec libx264 xxx.h264 (フォーマット変換)
-vcodec : コーデック指定
% ffmpeg -i xxx.mp4 -an -vcodec libx264 xxx.h264 (フォーマット変換)
-an : 音声削除
% ffmpeg -i xxx.mp4 -vf scale=-1:720 xxx.mp4 (画像サイズ変換)
-vf : エフェクト指定
% ffmpeg -i xxx.mp4 -r 12 xxx.mp4 (fpsの変換)
% ffmpeg -i xxx.mp4 -crf 25 xxx.mp4 (品質の変換)
-crf : constant rate factor, 固定レート因子、大きい方が高画質
% ffmpeg -ss 2 -i input_file.mp4 -t 41 -c copy output_file.mp4 (時間指定切り取り)
(2秒目から41秒間を切り取って新しいファイルにする)
% ffmpeg -f concat -i list.txt -c copy concat.mp4 (動画を繋げる)
list.txt
file ‘xxx.mp4’
file ‘yyy.mp4’
file ‘zzz.mp4’
参考)
ファイルを連続で開く方法
編集しなければいけないファイルが、複数あるとき、そのファイル名をテキストファイル(file_list.txt)に書いておいて、順に開けると便利である。 以下をmy_open.sh等で保存して実行権を付与して実行すると、順にviで開く。
#/bin/bash
number_of_lines=`awk 'END{print NR}' file_list.txt`
for ((i=1; i<=$number_of_lines;i++)); do
file=`awk NR==${i} file_list.txt`
vi $file
done
更新したファイルだけアップロードする方法
ホームページを管理していると、全部アップロードするのではなく、修正したファイルだけアップロードしたいときがよくある。
そこで、更新されたファイルだけアップロードするスクリプトを作成した。
更新日時には、Unix time(1970年1月1日からの積算秒)を使用して、新しくなっていれば(値が大きくなっていれば)アップロードする。
更新するファイル全体のリストは別途あるとして、これを、update_files.txtとする。
ファイル名とUnix timeの組み合わせが基本であるが、ファイル名だけの場合には、初期登録という形になる。
次は、その例である。
aa.html 1666408466
bbb.html 1666250583
cccc.php
ddd.css 1666670931
このファイルを読んで、aa.htmlの現在のUnix timeをチェックする。
値が大きくなっていれば、更新されたということなので、アップロードし、aa.htmlのUnix timeを更新する。
値が同じ場合には、何もしない(更新無し)。
値が小さい場合には、何かおかしいことが起こっているため、警告メッセージを出して、何もしない。
これは、一つのパソコンで作業していれば、値が小さくなるということは基本的に無いが、ファイル共有システムを使って、複数の端末で作業しているような場合には、ファイルの共有がうまく行われないことが原因であることが多い。要確認のこと。
備考)
xxx1からxxx4は、環境依存なので、適宜入力のこと。
例)
xxx1: burabura@onamae.ne.jp
xxx2: /home/yyy/public_html/zzz/blog
xxx3: /Users/aaa/web/
xxx4: -P 8022 -i temple.pen
#!/bin/bash
echo "Updating files is started ..."
data_file=zzz_update_files.txt
tmp_data_file=tmp_update_file.txt
REMOTE_SERVER="xxx1"
REMOTE_DIR="xxx2"
LOCAL_DIR="xxx3"
SCP_OPTIONS="xxx4"
rm -f $tmp_data_file
touch $tmp_data_file
echo "Reading zzz_update_files.txt ..."
number_of_lines=`awk 'END{print NR}' ${data_file}`
echo "Number of files:" $number_of_lines
echo "----------------------------------------------------------"
for ((i=1; i<=$number_of_lines;i++)); do
file_info_line=`awk NR==${i} ${data_file}`
file_info=(${file_info_line// / })
echo ${file_info[0]}
stat_result=`ls -l ${file_info[0]}`
updated_time=`date -r ${file_info[0]} +%s`
if [ "${file_info[1]}" != "" ]; then
if [ ${updated_time} -gt ${file_info[1]} ]; then
echo "Update!"
echo ${file_info[0]} ${updated_time} >> $tmp_data_file
scp $SCP_OPTIONS $LOCAL_DIR${file_info[0]} $REMOTE_SERVER:$REMOTE_DIR
elif [ ${updated_time} -eq ${file_info[1]} ]; then
echo ${file_info[0]} ${file_info[1]} >> $tmp_data_file
echo "Not updated! (Same time stamp) "
else
echo ${file_info[0]} ${file_info[1]} >> $tmp_data_file
echo "Not updated the file and time stamp!"
echo "||||||||||| Something wrong ! |||||||||||"
fi
else
echo "Make time stamp! and Updated!"
echo ${file_info[0]} ${updated_time} >> $tmp_data_file
scp $SCP_OPTIONS $LOCAL_DIR${file_info[0]} $REMOTE_SERVER:$REMOTE_DIR
fi
echo "----------------------------------------------------------"
done
mv $tmp_data_file $data_file
exit 0
各種バージョン確認方法
% python3 -c 'import tensorflow as tf; print(tf.__version__)'
% python3 -c 'import cv2; print(cv2.__version__)'
% python3 -c 'import numpy; print(numpy.__version__)'
改訂履歴
2022年10月29日:更新したファイルだけアップロードする方法を追記
2022年08月01日:ffmpegのコメント追記
2022年07月23日:nkf追記、言葉使いの変更
2021年12月21日:convertコマンド追記
2021年12月 7日:linkコマンドの間違い修正
2021年11月23日:findコマンドに"type -f"を追記、体裁を修正