Linuxコマンド(ファイル操作)のチートシート - oasis3855/webpage GitHub Wiki

Home > Software > ソフトウエア開発・PC管理のメモ帳 > this page (このページ)


Linuxでファイル関連の処理を行うコマンドを個人的にメモしたものです



Table of Contents

ブロックデバイスの命名法

SATA, USBドライブ等
sd + デバイス認識順 a b c ... + パーティションno 1 2 3 ...
例 : sda3 = 1番目のデバイス(a)の3番目のパーティション(3)
NVMEドライブ
nvme + コントローラno 0 1 2 ... + デバイスno 1 2 3 ...+ パーティションno 1 2 3 ...
例 : nvme0n1p3 = 1番目のコントローラ(0)の1番目デバイス(1)の3番目のパーティション(3)

ディスク情報

ブロックデバイス一覧情報
 lsblk [--nodeps] [--bytes] [--fs] [デバイス名|パーティション名]
--nodeps : 個別パーティションを表示しない(デバイスのみ表示)、--bytes : 単位をBytes、--fs : 全情報を出力
 blkid [-t NAME=値] [デバイス名|パーティション名]
-t NAME=値 : TYPEカラムがext4のものだけ表示したい場合は-t TYPE=ext4
例 : sudo blkid -t TYPE=ext4
 hdparm [-I] [-T] [-t] [デバイス名]
-I : 詳細情報を表示(NVMEでは不可)、-T : キャッシュリード速度を計測、-t : バッファードリード速度を計測
例 : sudo hdparm -I /dev/sda
パーティション情報
 fdisk -l [デバイス名]
SMART情報
 smartctl -a デバイス名
NVMEデバイス
コントローラ一覧を表示
 nvme list

デバイスの詳細情報表示

 nvme id-ctrl -H デバイス名
例 : sudo nvme id-ctrl -H /dev/nvme0n1
SMART情報表示
 nvme smart-log デバイス名

エラー情報表示

 nvme error-log デバイス名

ディスクコピー, ファイルコピー

ディスク、ファイルなどのコピー
 dd if=入力ファイル of=出力ファイル bs=ブロックサイズ count=回数
bs=nnn : デフォルトは512バイト、ほかに 1024, 1K(=1024Bytes), 1kB(=1000Bytes), 1M, 1MB(=1000*1000Bytes), 10M ... などと指定する
count=nnn : 指定しない場合のデフォルトはファイルエンドまたはディスクエンドまで、ほかにbsと同じく 1024, 1K, 1M ...
例 : 1MBytesのファイルを作成する
 dd if=/dev/urandom of=./test.dat bs=1K count=1024

途中経過表示のあるディスク, ファイルコピー

 ddrescue [-v|-v -v] [--ask] [--sector-size=512] [--cluster-size=128] [--log-events=イベントログ.txt] 入力ファイル 出力ファイル [MAPファイル.txt]
--sector-size=512 : 1クラスターのサイズ (Bytes), --cluster-size=128 : コピーする単位 (Sector), cluster-sizeを1とすれば、512Bytesずつコピーする
--ask : コピー開始前にプロンプト表示
-v : 経過を詳細表示
ddrescue MAPファイルのビジュアル表示
 ddrescuemap MAPファイル.txt

ファイル 一般的操作

開かれているファイルと、プロセス名の一覧表示 (パス名はワイルドカード可 : 例 /var/log/*)
 lsof [パス名]

プロセス名(9カラム目)で並べ替える場合は

 lsof | sort -k 9

特定のユーザのみ

 lsof -u [user]
 lsof -u '[user-1],[user-2],[...]'

ネットワークを用いているもののみ (例としてsshのみの抽出も)

 lsof -i
 lsof -i:ssh

特定のプロセスのみ (例としてssh)

 lsof -c [process name]
 lsof -c ssh

複数条件で

 lsof -a -c [process name] -u [user]

ファイル名変換

ファイル名の先頭/末尾に文字列を追加する
 rename 's/^/文字列/' *.jpg
 rename 's/.jpg$/文字列.jpg/' *.jpg
ファイル名を小文字に変換
変換したいファイルのあるディレクトリに移動して、次のスクリプトを実行 (*.JPGが対象の場合の例)
 for i in [A-Z]* ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done;

または

 rename 'y/A-Z/a-z/' *

ファイル名の特定文字列を置換

 rename 's/置換前/置換後/' *
「空白文字」を「_(下線)」に変換する(半角版、全角版)
 find ./dir/ -name "* *" | rename 's/ /_/g'
 find ./dir/ -name "* *" | rename 's/ /_/g'
連番ファイル(一時ファイル)を作成
 touch temp{1..10}.tmp

または...

 for ((i=0;i<10;i++)); do echo -n > temp$i.tmp; done
フォルダ内のファイルを連番ファイル名に改名する。
例:abc.txt, cdf.jpg -> 0001.txt, 0002.jpg
#!/bin/sh

# http://mizupc8.bio.mie-u.ac.jp/pukiwiki/index.php?TIPS%2FLinux%2F019 をかなり参考にした。

# 関数:get_sernumstr 番号 桁数
get_sernumstr()
{
  tmpstr="$1"
  while [ ${#tmpstr} -lt $2 ]
    do
      tmpstr="0"$tmpstr
    done
    echo $tmpstr
}

if [ $# -ne 1 ]
then
  echo "usage : renfile.sh basename\n\n"
  echo " example renfile.sh test -> test0001.jpg\n example renfile.sh null -> 0001.jpg\n"
  exit
fi

if [ "$1" = "null" ]
then
 TMP_BASE_NAME=""
else
 TMP_BASE_NAME=$1
fi

# ファイル名の末尾は1からの連番とする。
NUM=1
# 数値は4桁。
LEN=4

for SRC in `find -maxdepth 1 -name "*" -type f | sort -n`; do
  SERNO=`get_sernumstr $NUM $LEN`
  DST="${TMP_BASE_NAME}${SERNO}.${SRC##*.}"
  echo $SRC $DST
  mv -i $SRC $DST
  NUM=`expr $NUM + 1`
done
連番ファイル名を逆順のファイル名に並べ替える
例:0001.jpg -> 004.jpg, 0002.jpg -> 003.jpg, 0003.jpg -> 002.jpg, 0004.jpg -> 001.jpg
 ls *.jpg | sort -t - -k 2 -n --reverse | awk '{ printf "mv %s %03d.jpg\n", $0, NR }' | sh

その他のファイル名操作

フルパスからコア部分を抜き出す(/dir/test.txt → test)
 STR=/tmp/test.txt; echo `basename ${STR%.*}`
拡張子のみ抜き出す(/dir/test.txt → txt)
 STR=/tmp/test.txt; echo ${STR##*.}
ファイル名のみ抜き出す(/dir/test.txt → test.txt)
 STR=/tmp/test.txt; echo `basename ${STR}`
 STR=/tmp/test.txt; echo ${STR##*/}
拡張子のみ取り外す(/dir/test.txt → /dir/test)
 STR=/tmp/test.txt; echo ${STR%.*}
指定された拡張子”以外の”ファイルを検索する
 find -name '*[^.jpg$]' -print
ShiftJISでzip圧縮を行う
(あらかじめdataというディレクトリにファイルを格納しておく)
 convmv --r --notest -f utf8 -t cp932 ./data
 zip -r data.zip ./data

ファイル日時操作

指定したディレクトリ以下のファイルのタイムスタンプを現在日時に変更
 find /path/to/dir/ -name '*' -print -exec touch {} \;

指定した日時に変更する場合は

 find /path/to/dir/ -name '*' -print -exec touch -t YYYYMMDDhhmm.ss {} \;

指定したファイルの日時に、他の全てのファイルを合わせる場合

 find /path/to/dir/ -name '*' -print -exec touch --reference=Filename {} \;
ディレクトリ内で最も新しいファイルを表示する
 ls -t | head -n 1
ファイルのタイムスタンプをコピーする(../ref/*.jpgのタイムスタンプを、./にそれぞれコピー)
 find ./ -name '*.jpg' -print -exec sh -c 'touch -r ../ref/$(basename {}) {}' \;
指定されたディレクトリのファイル日時を、一定時間だけずらす
 find ./ -name '*.jpg' -print -exec touch -r {} -d '-9 hour' {} \;

CD,DVDドライブ, ISOイメージファイル

isoイメージファイルの作成
 readom dev=/dev/sr0 f=./imagefile.iso
日本語を含むisoイメージファイルのマウント(要root権限)
 mount -o loop,iocharset=utf8 -t iso9660 ./imagefile.iso ./cdrom
User権限でisoイメージファイルのマウント
 fuseiso -p ./imagefile.iso ./cdrom

マウントを解除するときは、fuseisoプロセスをkillする。"-p"オプションはマウントdirを自動作成。 GUI版はFurius ISO Mount

トレイ開閉関連
CD/DVDドライブをイジェクトする
 eject [/dev/sr0]

CD/DVDドライブのトレイを閉める

 eject -t [/dev/sr0]
情報表示
デフォルトの操作対象のCD/DVDドライブのデバイス名を得る
 eject -n

DVD±RWのメディア情報を表示する

 dvd+rw-mediainfo /dev/sr0

CD±RWドライブの情報を得る(マウントされている場合は umount /dev/cdrom してから)

 cdrecord -checkdrive
DVD±RW書き込み
DVD±RWを強制フォーマットする
 dvd+rw-format /dev/sr0 -force

DVD±RWにisoファイルを書き込む

 growisofs [-speed=2] [-dvd-compat] -Z /dev/sr0=filename.iso
CD±RW書き込み
CD±RWを強制フォーマットする(マウントされている場合は umount /dev/cdrom してから)
 cdrecord [-v] [dev=/dev/sr0] blank=fast

CD±RWにisoファイルを書き込む(マウントされている場合は umount /dev/cdrom してから)

 cdrecord [-v] [-eject] [driveropts=burnfree] [dev=/dev/sr0] filename.iso
ドライブの読み書き可能なメディア形式を照会
 cat /proc/sys/dev/cdrom/info
⚠️ **GitHub.com Fallback** ⚠️