[Software Tips] bash

更新日:2022年10月29日(初版作成日:2020年10月31日)

当該ディレクトリ以下の全ソースファイル(*.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&gt&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’

参考)

ffmpeg -an で撮影済みビデオの音を消去

ファイルを連続で開く方法

編集しなければいけないファイルが、複数あるとき、そのファイル名をテキストファイル(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"を追記、体裁を修正

タイトルとURLをコピーしました