rsync: [generator] recv_generator: failed to stat “/mnt/nas10tb/Signage/20210518/20210518-15.jpg”: Bad message (74)何の意味?

rsync: [generator] recv_generator: failed to stat “/mnt/nas10tb/Signage/20210518/20210518-15.jpg”: Bad message (74)何の意味?

このエラーは、rsyncが特定のファイルの状態を確認(stat)しようとした際、OSレベルで「ファイルデータが壊れている」と判断されたことを意味します。

具体的には、Linuxのシステムエラー番号 74 (EBADMSG: Bad message) が発生しています。

主な原因

このエラーは単なるrsyncの不具合ではなく、ストレージや通信の根本的な問題である可能性が高いです。 

  • ファイルシステムの破損: NAS(/mnt/nas10tb)上の該当ファイルが物理的または論理的に破損しており、OSが読み取れない状態。
  • ハードウェアの故障: HDD/SSDの物理的な不良セクタや、NASのメモリ(RAM)エラー。
  • 通信経路の異常: NASとの接続に使用しているプロトコル(NFSやSMBなど)が不安定で、データ整合性が崩れている。

推奨される対処法

  1. ファイルの生存確認:
    該当ファイル(20210518-15.jpg)を ls -l や cat 等で手動で読み取れるか確認してください。同様にエラーが出る場合はファイル自体が壊れています。
  2. ファイルシステムのチェック:
    NAS側で管理画面やSSHを利用し、fsck などのコマンドでファイルシステムの修復を試みてください。
  3. NASのログ確認:
    NAS側のシステムログ(dmesgなど)に、I/Oエラーやディスクの異常(S.M.A.R.T.エラー)が記録されていないか確認してください。
  4. 再マウント:
    一時的な通信エラーであれば、NASをアンマウントして再度マウントし直すことで解消する場合があります。

まずは、該当するファイルを手動で別の場所にコピーできるか試してみるのが一番の切り分けになります。

    コピーできませんし、sudo rmで削除しようとしてもrm: cannot remove ‘/mnt/nas10tb/Signage/20210518/20210518-15.jpg’: Bad messageで拒否されます。

    sudo rm

     でも削除できない状態は、OSがファイルシステム上のデータ構造(メタデータ)を正しく解釈できていない深刻な不整合を示しています。

    「Bad message」エラーが出ている場合、通常のファイル操作コマンド(rmcpmv)は受け付けられません。以下の順序で対処を検討してください。

    1. NASの「修復機能」を実行する(最優先)

    マウントしているPC側から操作するのではなく、NAS自体のOS(管理画面)からチェックを行うのが最も安全です。

    • 管理画面から: QNAPやSynology、バッファロー等のNASであれば、ブラウザの管理画面にある「ストレージマネージャー」等から「ファイルシステムのチェック」や「ボリュームの修復」を実行してください。
    • RAIDの整合性チェック: RAID構成を組んでいる場合は、データスクラビング(整合性確認)を実行することで修復される可能性があります。

    2. ファイルシステムチェック(fsck)の実行

    Linuxサーバー等にHDDを直接接続、またはNASにSSHで入れる場合は fsck コマンドを使用します。

    注意fsck は必ず対象のパーティションを アンマウント(umount) した状態で実行してください。マウントしたまま行うとデータが完全に破壊される恐れがあります。

    bash

    # アンマウント(例: /dev/sdb1 が対象の場合)
    sudo umount /mnt/nas10tb
    
    # チェックと修復の実行
    sudo fsck -y /dev/sdb1
    

    ※ -y オプションはすべての修復提案に自動で “yes” と答える設定です。 1.4.6 

    3. ディレクトリごと削除を試みる

    ファイル単位で「Bad message」が出る場合でも、その親ディレクトリごと削除(rm -rf)することで、ディレクトリのエントリごと消去できる場合があります。

    • リスク: そのフォルダ内の正常なファイルもすべて消えます。必要なデータは先に別の場所へ退避させてください。
    • 方法sudo rm -rf /mnt/nas10tb/Signage/20210518/ 

    4. ハードウェア故障(不良セクタ)の疑い

    修復を試みてもエラーが消えない、あるいは fsck が途中で止まる場合は、HDDの物理的な不良セクタ(メディア故障)が原因です。 1.4.3

    • この場合、無理に書き込み(削除)を続けようとすると他のデータまで破損する恐れがあります。
    • NASのログで「I/O Error」や「SMART Error」が出ていないか確認し、異常があればHDDの交換を検討してください。

    このNASは、メーカー製品(QNAP/Synology等)でしょうか、それとも自作のLinuxサーバーでしょうか?機種や構成がわかれば、より具体的な修復手順を提示できます。

    自作のUbuntuサーバーです。

    自作のUbuntuサーバーで 

    Bad message により削除すらできない場合、ファイルシステムのメタデータが壊れており、カーネルがそのファイルへの操作を拒否しています。 

    以下の手順で、ファイルシステムの強制修復を試みてください。

    手順1:ファイルシステムの種類とデバイス名の確認

    修復には正確なデバイス名(/dev/sdb1 など)が必要です。以下のコマンドで確認してください。

    bash

    df -Th | grep /mnt/nas10tb
    
    • ここで表示される「Filesystem」列(例: /dev/sdc1)と「Type」列(例: ext4xfs)をメモしてください。

    手順2:アンマウント

    修復作業(fsck)は、対象のディスクをマウントしたまま行ってはいけません。 

    bash

    sudo umount /mnt/nas10tb
    

    コードは注意してご使用ください。

    ※ 「target is busy」と出る場合は、sudo fuser -mk /mnt/nas10tb でアクセス中のプロセスを強制終了させてから再度試してください。

    手順3:強制修復(fsck)の実行

    ファイルシステムの種類に合わせて以下のコマンドを実行します。

    • ext4 の場合:bashsudo fsck.ext4 -fy /dev/対象デバイス名 コードは注意してご使用ください。-f は強制チェック、-y はすべての修復に自動で「はい」と答えるオプションです。
    • XFS の場合:bashsudo xfs_repair /dev/対象デバイス名 コードは注意してご使用ください。 

    手順4:再マウントと確認

    修復が終わったら、再度マウントしてファイルが消えているか(または削除できるか)確認します。

    bash

    sudo mount -a
    ls /mnt/nas10tb/Signage/20210518/
    

    コードは注意してご使用ください。

    それでも解決しない場合

    もし fsck で「Input/output error」が出る、あるいは修復後も再発する場合は、HDDの物理故障(不良セクタ)が確定です。

    • dmesgの確認sudo dmesg | grep -i error で、ディスク関連のハードウェアエラーが出ていないかチェックしてください。
    • 物理故障の疑い: 故障している場合は、該当ドライブのデータを可能な限り救出した後、速やかにHDDを交換することをお勧めします。 

    現在、ファイルシステムの種類(ext4 や zfs など)は何を使用されていますか?

    対象のnas10tbはRAID5のアレイです。ext4を使用しています。

    自作のUbuntuサーバーかつRAID5(ext4)の環境で 

    Bad message が出ている場合、「RAIDアレイ内の特定のディスクで読み取りエラーが発生し、それがファイルシステムの破損(メタデータの矛盾)として現れている」 可能性が非常に高いです。

    通常の rm では消せないため、以下の手順で RAIDの整合性チェック と ファイルシステムの修復 を組み合わせて対処してください。

    手順1:RAIDの状態を確認する

    まず、RAIDアレイ自体が正常(Active)か、どこかのディスクが脱落(Degraded)していないか確認します。

    bash

    cat /proc/mdstat
    
    • [UUU] のようにすべて U であれば正常です。[_UU] のように _ がある場合はディスクが故障しています。 1.5.3

    手順2:RAIDの整合性チェック(check)を実行 

    RAID5のパリティを利用して、不整合を修復させます。これにより、ファイルシステムレベルの修復(fsck)が通りやすくなることがあります。 1.5.4 

    bash

    # md0 はご自身の環境に合わせて読み替えてください
    echo check | sudo tee /sys/block/md0/md/sync_action
    
    • /proc/mdstat を見ると進捗が確認できます。10TBだと数時間〜一日以上かかる場合があります。 

    手順3:アンマウントして fsck を実行

    RAIDのチェックが終わるか、あるいは待てない場合は、対象のアレイをアンマウントして ファイルシステムの強制修復 を行います。 

    bash

    # 1. アンマウント
    sudo umount /mnt/nas10tb
    
    # 2. 強制修復(-f: 強制, -y: 全てyesで修復)
    sudo fsck.ext4 -fy /dev/md0
    
    • Bad message の原因となっている不正なiノードやディレクトリエントリがここで修正・削除されます。 1.3.1

    手順4:ディスクの物理故障を確認(重要)

    Bad message は物理故障の前兆であることが多いです。特定のディスクに異常がないか、S.M.A.R.T.情報を確認してください。 1.2.8

    bash

    # 各物理ディスク(/dev/sda, sdb...)に対して実行
    sudo smartctl -a /dev/sda | grep -i error
    
    • Reallocated_Sector_Ct や Current_Pending_Sector の値が 0 以外であれば、そのディスクの寿命です。

    アドバイス:
    RAID5は1台の故障には耐えられますが、修復中(リビルド中)に2台目が壊れると全データが消失します。10TBの大容量HDDではリビルド負荷で連鎖故障が起きやすいため、もし fsck で直っても、早めに重要なデータのバックアップを別の媒体に取ることを強くお勧めします。 1.3.7 

    まずは cat /proc/mdstat の結果に _(異常)が含まれていないか教えていただけますか

    全てUです。S.M.A.R.T.情報にも問題はありませんでした。いまfsckをかけています。

    RAIDアレイ(

    mdstat)も物理ディスク(S.M.A.R.T.)も正常であるとのこと、ひとまず「物理的な崩壊」の可能性が低そうで安心しました

    となると、今回の原因はハードウェア故障ではなく、「OSのクラッシュ」「停電」「不適切なアンマウント」などによって、ext4のメタデータ(管理情報)に論理的な矛盾が生じたものと考えられます。

    fsck実行中の注意点と次のステップ

    1. 「lost+found」ディレクトリの確認
      fsck -fy が完了して再マウントした後、/mnt/nas10tb/lost+found/ を覗いてみてください。
      ファイル名が特定できなくなったデータが #12345 のような番号で復元されている場合があります。今回エラーが出ていた 20210518-15.jpg も、実体が生きていればここに放り込まれている可能性があります。 参考: Cyberciti – lost+found folder
    2. rsyncの再開
      修復が終われば、再び rsync が通るようになるはずです。
      もし rsync がまた止まるようなら、別のディレクトリにも同様の破損が潜んでいるサインですので、再度 fsck が必要になるかもしれません。
    3. dmesg のモニタリング
      もし fsck 中に大量の「Pass 1: Checking inodes, blocks, and sizes」的な修正が走っているなら、完了後に念のため以下を実行して、カーネルがまだ何か文句を言っていないか確認してください。bashdmesg | tail -n 50 コードは注意してご使用ください。

    10TBという大容量だと fsck の完了まで時間がかかるかもしれませんが、途中で中断(Ctrl+C)しないようにだけご注意ください。

    無事に 20210518-15.jpg(あるいはその残骸)が消去または修復されることを祈っています。修復完了後、正常にアクセスできるようになったか教えてくださいね。

    fsckで修復されたようです。念のためcpして内容の確認もしておきます。

    無事に 

    fsck で修復できたようで何よりです!
    物理故障(S.M.A.R.T.エラー)がなく、アレイも正常(All U)だったことから、純粋なファイルシステムの論理矛盾だった可能性が高いですね。

    cp での確認は非常に賢明な判断です。以下の点もあわせてチェックしておくと安心です。

    1. ファイルの整合性:
      コピーできたとしても、画像ファイル(.jpg)の場合、下半分がグレーになっていたりノイズが乗っていたりすることがあります。一度ビューアーで開いて画像が壊れていないか確認することをおすすめします。
    2. rsync の再走:
      原因となったファイル以外にも、インデックス(inode)が狂っていた箇所があるかもしれません。一度 rsync --dry-run を実行して、他に同様のエラーが出ないかサッと流してみるのが確実です。
    3. lost+found の掃除:
      もし fsck で「ファイル名が特定できないデータ」が救出されていた場合、マウントポイント直下の lost+found フォルダに溜まっています。不要であれば容量を食うだけなので、確認後に削除してOKです。

    今回のトラブルが一時的なソフトエラー(書き込み中の瞬断など)であれば良いのですが、もし今後も頻発するようなら、SATAケーブルの接触不良メモリ(RAM)の相性・故障も疑ってみてください。

    このまま rsync は無事に完走しそうですか?

    やってみます。ありがとうございました。

    承知いたしました。無事に解決することを祈っています!

    もし rsync 中に再び似たようなエラー(Bad message や Input/output error)が出る場合は、ファイルシステムではなく、RAIDコントローラやケーブル、あるいはメモリ(RAM)など、別のレイヤーのトラブルも疑う必要が出てきます。

    しばらくは dmesg -w などでシステムログを監視しながら作業を進めてみてください。

    また何かお困りのことがあれば、いつでもご相談ください。
    rsync が無事に完走することを願っています!

    macOSで作業しています。フォルダ内に画像が沢山入っているフォルダがいくつかあります。jpgとpngが混在しています。中にはjpegというのもあります。全てjpgに統一したいのです。スクリプトを組みたいのですが、サンプルをお願いします。

    macOSで作業しています。フォルダ内に画像が沢山入っているフォルダがいくつかあります。jpgとpngが混在しています。中にはjpegというのもあります。全てjpgに統一したいのです。スクリプトを組みたいのですが、サンプルをお願いします。

    macOSで画像形式(拡張子)を一括でJPGに統一するには、標準搭載されている強力な画像処理コマンド sips を使用するのが最も効率的です。 

    以下に、特定のフォルダ(およびその中にある子フォルダ)内の画像をすべて .jpg に変換し、元のファイルを削除するスクリプトのサンプルを紹介します。

    1. ターミナルで実行するワンライナー

    最も手軽な方法です。対象のフォルダに移動して実行してください。

    zsh

    # 対象のフォルダへ移動
    cd /path/to/your/folder
    
    # png, jpeg, JPEG などを一括で jpg に変換
    for f in *.{png,jpeg,JPEG,PNG}; do [ -f "$f" ] && sips -s format jpeg "$f" --out "${f%.*}.jpg" && rm "$f"; done
    
    • sips -s format jpeg: 画像をJPEG形式に変換します。
    • ${f%.*}.jpg: 元のファイル名から拡張子を取り除き、一律 .jpg を付与します。
    • rm "$f": 変換が成功した後に元のファイルを削除します(不要な場合は削除してください)。 

    2. 複数のフォルダ(サブフォルダ)をまとめて処理するスクリプト

    階層構造になっている複数のフォルダを一度に処理したい場合は、以下のスクリプトをファイル(例: convert.sh)として保存して実行してください。

    bash

    #!/bin/bash
    
    # 変換したい親フォルダのパスを指定
    TARGET_DIR="./target_images"
    
    # 指定フォルダ内の png, jpeg を探し、1つずつ jpg へ変換
    find "$TARGET_DIR" -type f \( -iname "*.png" -o -iname "*.jpeg" \) | while read -r file; do
        # 出力ファイル名を作成(拡張子を .jpg に変更)
        output="${file%.*}.jpg"
        
        # 変換実行
        sips -s format jpeg "$file" --out "$output" > /dev/null 2>&1
        
        # 変換が成功し、かつ元ファイルと別名であれば元を削除
        if [ $? -eq 0 ] && [ "$file" != "$output" ]; then
            rm "$file"
            echo "Converted: $file -> $output"
        fi
    done
    

    実行方法

    1. テキストエディタに上記コードを貼り付け、convert.sh として保存します。
    2. ターミナルで実行権限を与えます:chmod +x convert.sh
    3. スクリプトを実行します:./convert.sh

    補足・注意点

    • 画質の指定sips -s formatOptions 80 のようにオプションを追加することで、圧縮率(画質)を調整できます(0〜100、デフォルトは約80)。
    • 既存の .jpg: 元々 .jpg という拡張子のファイルは、このスクリプトでは(二重変換を避けるため)処理対象から外しています。
    • バックアップ: 大量のファイルを操作するため、実行前にフォルダのコピー(バックアップ)を取っておくことを強く推奨します。 

    スクリプトではなく、Finderの右クリックメニュー(クイックアクション)から一括変換したい場合は、Automator を使用して「イメージのタイプを変更」アクションを設定する方法も便利です。 

    処理したいフォルダの構造(1つのフォルダか、階層構造か)や、変換後の画質へのこだわりはありますか?

    画質はデフォルトでOKです。フォルダ構造はフォルダの中に1階層だけです。

    「親フォルダ > 子フォルダ > 画像ファイル」という1階層の構造ですね。

    macOS標準の sips コマンドを使用し、子フォルダ内の .png や .jpeg を一括で .jpg に変換し、元のファイルを削除するスクリプトを作成しました。 

    1. 実行用スクリプト(保存して使う場合)

    以下のコードをテキストエディタに貼り付け、convert.sh という名前で保存してください。

    bash

    #!/bin/zsh
    
    # 1. 処理したい「親フォルダ」のパスを指定してください
    # 例: TARGET_DIR="$HOME/Desktop/MyPhotos"
    TARGET_DIR="./対象の親フォルダ名"
    
    # 2. 親フォルダ直下の子フォルダをループ処理
    for subfolder in "$TARGET_DIR"/*(/); do
        echo "Processing folder: $subfolder"
        
        # 3. 子フォルダ内の png, jpeg, JPEG, PNG を探して変換
        # 拡張子が jpg 以外のものを対象にします
        for file in "$subfolder"/*.{png,jpeg,PNG,JPEG}(N); do
            # 出力ファイル名(拡張子を .jpg に変更)
            output="${file%.*}.jpg"
            
            # sipsで変換実行
            sips -s format jpeg "$file" --out "$output" > /dev/null 2>&1
            
            # 変換に成功し、かつ元ファイルと別名なら元を削除
            if [[ $? -eq 0 && "$file" != "$output" ]]; then
                rm "$file"
            fi
        done
    done
    
    echo "完了しました。"
    

    使い方

    1. パスの書き換えTARGET_DIR の部分を作業したいフォルダ名(またはパス)に書き換えます。
    2. 実行権限の付与: ターミナルで chmod +x convert.sh を実行します。
    3. 実行./convert.sh で開始します。

    2. ターミナルで即座に実行する(ワンライナー)

    スクリプトを作らずに、ターミナルで親フォルダまで移動(cd)してから直接実行する方法です。 

    zsh

    for d in *(/); do for f in "$d"/*.{png,jpeg,PNG,JPEG}(N); do sips -s format jpeg "$f" --out "${f%.*}.jpg" && rm "$f"; done; done
    
    • *(/): フォルダ(ディレクトリ)のみを対象にします。
    • (N): 該当する拡張子のファイルがない場合にエラーを出さない設定です。

    注意事項

    • 上書き確認: このスクリプトは変換後に元のファイルを削除 (rm) します。念のため、最初はテスト用のフォルダで動作を確認するか、バックアップを取ってから実行してください 1.2.2, 1.3.1。
    • 拡張子の統一: 全て小文字の .jpg に統一されます。 

    このスクリプトを定期的に使いたい、あるいは特定の画質(圧縮率)を指定したいといったご要望はありますか?

    Windows11でデバイスドライバには認識されているにもかかわらず、ドライブDとして認識されていないHDDがあります。どうチェックすればいいですか。

    Windows11でデバイスドライバには認識されているにもかかわらず、ドライブDとして認識されていないHDDがあります。どうチェックすればいいですか。

    Windows 11でデバイスマネージャーには表示されているのに「Dドライブ」として認識されない場合、ハードウェア自体はPCに繋がっていますが、「OS側でドライブレター(D:)が割り当てられていない」か、「パーティションが未定義」である可能性が高いです

    以下の手順で「ディスクの管理」ツールを使用してチェック・修正してください。

    1. 「ディスクの管理」を開く 

    1. 画面下の「スタート」ボタンを右クリックします。
    2. メニューから [ディスクの管理] を選択します。 

    2. ディスクの状態を確認する 

    開いた画面の下半分にある「ディスク 0」「ディスク 1」といった一覧から、該当のHDDを探します。その右側のバー(ボリューム)の状態によって対処が異なります。

    • 「未割り当て」と表示されている場合
      • 原因: パーティションが作成されていません(新品のHDDなど)。
      • 対処: 右クリックして [新しいシンプルボリューム] を選択し、画面の指示に従ってフォーマットとドライブ文字の割り当て(D:)を行います。※データは消去されるため、データが入っているはずの場合は注意してください。
    • 「(文字なし)」または「正常」でバーが青い場合
      • 原因: パーティションはあるが、ドライブレター(D:など)が割り当てられていません。
      • 対処: その部分を右クリックし、[ドライブ文字とパスの変更] を選択 → [追加] を押し、ドライブ文字に「D」を割り当てて [OK] をクリックします。
    • 「不明・初期化されていません」と表示されている場合
      • 原因: パーティションスタイルが設定されていません。
      • 対処: 「ディスク X」と書かれた左端の領域を右クリックして [ディスクの初期化] を行います。通常は「GPT」を選択します。 エプソン ホームページエプソン ホームページ +4

    3. それでも認識されない場合のクイックチェック

    • USBポートの変更: ポータブルHDDの場合、電力不足で動作が不安定になることがあります。PC背面のポートや別のUSBポートに差し替えてみてください。
    • ドライバーの再認識: デバイスマネージャーで該当のHDDを右クリックし、[デバイスのアンインストール] を選んだあと、PCを再起動して自動で再読み込みさせてください。 

    まずは「ディスクの管理」で、そのHDDのバーがどのような色や名前(未割り当て、正常など)になっているかを確認してみるのが第一歩です。

    今「ディスクの管理」を開いたとき、該当のドライブは何色のバーで表示されていますか?

    macOSを使っています。zipファイルが沢山入っているフォルダがあります。AppleDoubleを削除する必要があります。スクリプトを組みたいのですが、教えてもらえますか。

    macOSを使っています。zipファイルが沢山入っているフォルダがあります。AppleDoubleを削除する必要があります。スクリプトを組みたいのですが、教えてもらえますか。

    macOSでZIPファイル内に含まれる AppleDouble(._ で始まる隠しファイル) を一括削除するには、標準の zip コマンドの削除オプション(-d)を利用したシェルスクリプトが効率的です。 

    以下のスクリプトは、指定したフォルダ内のすべての .zip ファイルを走査し、内部の __MACOSX ディレクトリや ._ ファイルを削除します。

    AppleDouble 削除用シェルスクリプト

    bash

    #!/bin/bash
    
    # 対象のフォルダパスを指定(例: ~/Documents/zips)
    TARGET_DIR="パスを入力してください"
    
    # フォルダが存在するか確認
    if [ ! -d "$TARGET_DIR" ]; then
      echo "Error: Directory $TARGET_DIR does not exist."
      exit 1
    fi
    
    # フォルダ内の全zipファイルに対してループ処理
    find "$TARGET_DIR" -name "*.zip" -type f | while read -r zip_file; do
      echo "Processing: $zip_file"
      
      # zip内の AppleDouble 関連ファイルを削除
      # "__MACOSX/*" : リソースフォークが格納されるディレクトリ
      # "*/._*" : ファイル単位の AppleDouble ヘッダー
      zip -d "$zip_file" "__MACOSX/*" "*/._*" "._*" > /dev/null 2>&1
      
      if [ $? -eq 0 ]; then
        echo "  -> Cleaned successfully."
      else
        echo "  -> No AppleDouble files found or error occurred."
      fi
    done
    
    echo "Done."
    

    使い方

    1. テキストエディタ(標準の「テキストエディット」や VS Code など)を開き、上記をコピー&ペーストします。
    2. TARGET_DIR="パスを入力してください" の部分を、実際のフォルダパス(例:"/Users/あなたの名前/Desktop/test")に書き換えます。
    3. clean_zip.sh という名前で保存します。
    4. ターミナルを開き、以下のコマンドで実行権限を与えて実行します。bashchmod +x clean_zip.sh ./clean_zip.sh コードは注意してご使用ください。

    補足事項

    • AppleDoubleとは: macOS特有の「リソースフォーク(アイコン情報やメタデータ)」を、macOS以外のシステム(WindowsやLinux)でも保持するために生成される ._ から始まるヘッダーファイルのことです。
    • zip -d オプション: ZIPファイルを展開することなく、内部の特定のファイルのみを削除できるため、ファイル数が多い場合に非常に高速です。
    • 注意: スクリプトを実行する前に、念のためフォルダのバックアップを取っておくことをお勧めします。 

    特定のフォルダではなく、デスクトップ上のすべてのZIPを対象にするなど、さらに絞り込みが必要な場合は教えてください。

    ubuntuでRAID5のアレイが起動時にマウントされない。起動後に手動でsudo mount -aならマウントされる。原因はなんだろう。

    ubuntuでRAID5のアレイが起動時にマウントされない。起動後に手動でsudo mount -aならマウントされる。原因はなんだろう。

    場合、主な原因は「アレイの準備が整う前にシステムがマウントを試みている(タイミングの問題)」か、「初期RAMディスク(initramfs)内のRAID設定が古い」ことのいずれかです。 

    以下の手順で修正を試みてください。

    1. RAID設定情報の更新と反映

    RAIDの構成情報(UUIDなど)を最新の状態にして、OS起動の初期段階で読み込めるようにします。 

    1. 現在のRAID構成情報を設定ファイルに書き出す:bash# 既存の設定をバックアップ sudo cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak # 現在の状態をスキャンして反映 sudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf
    2. initramfsを更新する:
      OS起動時にRAIDを認識させるため、この手順が最も重要です。bashsudo update-initramfs -u

    2. /etc/fstab のマウントオプション調整 

    RAIDデバイスの準備が遅れる場合に備え、マウントオプションに defaults だけでなく、準備を待つための設定を追加します。 

    • 推奨設定例:
      /etc/fstab 内の対象行を以下のように書き換えます(UUIDは blkid コマンドで確認してください)。textUUID=あなたのRAIDアレイUUID /mnt/mountpoint ext4 defaults,nofail,x-systemd.device-timeout=30 0 2
      • nofail: デバイスが見つからなくても起動を止めないようにします。
      • x-systemd.device-timeout=30: デバイスが現れるのを最大30秒待ちます。 

    3. デバイス名の不一致の確認

    起動時にRAIDアレイが /dev/md0 ではなく、/dev/md127 など別の名前で認識されている場合があります。 

    • 対策/etc/fstab でのマウント指定を /dev/md0 のようなデバイス名ではなく、必ず UUID を使用するようにしてください。UUIDは以下のコマンドで取得できます。bashsudo blkid /dev/md0 # または現在のRAIDデバイス名

    これらの設定を行った後、再起動して自動マウントされるか確認してください。

    現在の /etc/fstab の設定内容や、起動直後の cat /proc/mdstat の結果を教えていただければ、より具体的な診断が可能です。

    UUID=c2bc4e5e-895c-45ea-b798-99e6fcc97b05 /mnt/nas10tb ext4 defaults 0 1Personalities : [raid6] [raid5] [raid4] [raid0] [raid1] [raid10] md0 : active raid5 sde1[4] sdb1[1] sdf1[3] sdc1[0] sdg1[5] sdd1[2] 9766924800 blocks super 1.2 level 5, 512k chunk, algorithm 2 [6/6] [UUUUUU] bitmap: 0/15 pages [0KB], 65536KB chunkです。

    ご提示いただいた 

    fstab と mdstat の情報を確認しました。RAID 5アレイ自体は正常に md0 として組まれていますが、現在の fstab 設定では「OSがRAIDの準備完了を待たずにマウントを試みて失敗している」可能性が高いです。 

    以下の3ステップで確実に解決できます。

    1. fstab の記述を「待機型」に修正

    現在の設定 defaults 0 1 では、起動プロセスの非常に早い段階でマウントが行われます。これを systemd に「デバイスが現れるまで待つ」よう指示するオプションに変更します。

    • 修正前UUID=c2bc4e5e-895c-45ea-b798-99e6fcc97b05 /mnt/nas10tb ext4 defaults 0 1
    • 修正後:textUUID=c2bc4e5e-895c-45ea-b798-99e6fcc97b05 /mnt/nas10tb ext4 defaults,nofail,x-systemd.device-timeout=30 0 2
      • nofail: 万が一RAIDが組めなかった時にOS起動が止まるのを防ぎます。
      • x-systemd.device-timeout=30: デバイスが認識されるまで最大30秒待機させます。
      • 末尾の 1 を 2 に変更: ルートパーティション以外のチェック優先度を下げます。 

    2. mdadm設定の更新と initramfs への反映 

    Ubuntuの起動初期段階(initramfs)でRAIDを正しく認識させるため、現在の構成情報を同期させます。これを怠ると、起動時に一時的に md127 など別の名前で認識され、UUIDでの紐付けが間に合わないことがあります。 

    1. 設定ファイルを現在の状態に更新:bashsudo mdadm --detail --scan | sudo tee /etc/mdadm/mdadm.conf
    2. 起動イメージを再生成:bashsudo update-initramfs -u

    3. 原因の切り分け(確認用)

    もし上記でも解決しない場合は、起動時に何が起きているかログで確認できます。 

    • エラーログの確認:bashjournalctl -b | grep nas10tb コードは注意してご使用ください。「Dependency failed」や「Timed out waiting for device」といったメッセージがあれば、やはりタイミングの問題です。

    次に再起動する際、上記の設定変更が完了していれば自動でマウントされるはずです。 設定反映後に一度再起動を試してみてください。

    やってみましたが、マウントされません。Feb 21 18:14:51 ubuntu-nas systemd[1]: Dependency failed for mnt-nas10tb.mount – /mnt/nas10tb.Feb 21 18:14:51 ubuntu-nas systemd[1]: mnt-nas10tb.mount: Job mnt-nas10tb.mount/start failed with result ‘dependency’.

    Dependency failed」というエラーは、systemdが「マウントしようとしたが、その前提となるRAIDデバイス(md0)が時間内に準備されなかった」ことを示しています。

    sudo mount -a で成功することから、RAID自体は正常ですが、OS起動の非常に早い段階でRAIDを組み立てるプロセスがスキップされている、あるいは間に合っていないのが原因です。

    以下の「強制的」な解決策を試してください。

    1. mdadmの自動組み立てを強制する

    Ubuntuの最近のバージョンでは、mdadm の設定ファイルに不整合があると、起動時の自動組み立てを止めてしまうことがあります。

    1. /etc/mdadm/mdadm.conf をクリーンにする:
      一度ファイルを空にしてから、現在の正しい構成情報だけを書き込みます。bash# バックアップを取る sudo cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak2 # 基本設定とスキャン結果を書き込む echo "DEVICE partitions" | sudo tee /etc/mdadm/mdadm.conf sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
    2. initramfsを再度、強制更新:bashsudo update-initramfs -u -k all

    2. systemd のマウント順序を明示的に指定する

    fstab の設定だけでは不十分な場合、systemdに対して「RAID管理サービスが完了してからマウントしてくれ」と明示します。

    • /etc/fstab を以下に書き換え:
      オプションに x-systemd.after=mdmonitor.service を追加します。textUUID=c2bc4e5e-895c-45ea-b798-99e6fcc97b05 /mnt/nas10tb ext4 defaults,nofail,x-systemd.device-timeout=30,x-systemd.after=mdmonitor.service 0 2

    3. それでもダメな場合の最終手段(起動スクリプト)

    特定のハードウェア構成でどうしても認識が遅れる場合、起動後に自動で mount -a を実行させるサービスを作ります。

    1. 新しいサービスファイルを作成:
      sudo nano /etc/systemd/system/mount-raid-fix.service
    2. 以下を貼り付け:ini[Unit] Description=Force Mount RAID after boot After=local-fs.target [Service] Type=oneshot ExecStart=/bin/mount -a RemainAfterExit=yes [Install] WantedBy=multi-user.target
    3. サービスを有効化:bashsudo systemctl daemon-reload sudo systemctl enable mount-raid-fix.service

    まずは 手順1と2 をセットで実施し、再起動してみてください。

    これらの手順を試した後もエラーが出る場合、起動直後の lsblk の結果(特にRAIDが md127 などに化けていないか)を確認させていただけますか?

    NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSloop0 7:0 0 13M 1 loop /snap/canonical-livepatch/378loop1 7:1 0 74M 1 loop /snap/core22/2292loop2 7:2 0 48.1M 1 loop /snap/snapd/25935sda 8:0 0 223.6G 0 disk ├─sda1 8:1 0 1G 0 part /boot/efi└─sda2 8:2 0 222.5G 0 part /sdb 8:16 0 1.8T 0 disk └─sdb1 8:17 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 sdc 8:32 0 1.8T 0 disk └─sdc1 8:33 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 sdd 8:48 0 1.8T 0 disk └─sdd1 8:49 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 sde 8:64 0 1.8T 0 disk └─sde1 8:65 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 sdf 8:80 0 1.8T 0 disk └─sdf1 8:81 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 sdg 8:96 0 1.8T 0 disk └─sdg1 8:97 0 1.8T 0 part └─md0 9:0 0 9.1T 0 raid5 マウントされません

    lsblk

     の結果を見ると、RAIDアレイ自体は正常に md0 として組み上がっています。それなのにマウントされないのは、**「systemdがUUIDを見失っている」「ファイルシステムのチェック(fsck)で止まっている」**可能性が高いです。

    特に10TBという大容量のため、起動時の微細なタイミングのズレが影響しています。

    以下の手順で、fstab の記述を**「UUID」ではなく「デバイスパス」による指定**に切り替えて、依存関係を強制解決しましょう。

    1. /etc/fstab の書き換え

    UUIDでの指定がうまくいかない(認識が遅れる)場合、/dev/md0 という直接のパスを指定するのが最も確実です。

    /etc/fstab を開き、対象の行を以下のように書き換えてください。

    text

    /dev/md0  /mnt/nas10tb  ext4  defaults,nofail,x-systemd.before=zfs-mount.service,x-systemd.device-timeout=60  0  0
    
    • ポイント:
      • UUID=... ではなく /dev/md0 を直接指定。
      • 末尾を 0 0 にして、起動時の fsck(ディスクチェック)をスキップ させます(これが原因でマウントがブロックされることが多いため)。
      • x-systemd.device-timeout=60: 待機時間をさらに伸ばします。

    2. mdadm 設定を「名前」で固定する

    OSが md0 という名前を確実に保持するようにします。

    1. /etc/mdadm/mdadm.conf を編集します。bashsudo nano /etc/mdadm/mdadm.conf コードは注意してご使用ください。
    2. ARRAY で始まる行の末尾に name=0 がなければ追加、あるいは以下のような形式になっているか確認してください。textARRAY /dev/md0 metadata=1.2 name=0 UUID=(あなたのRAIDのUUID) コードは注意してご使用ください。※ name=0 を入れることで、/dev/md0 として固定されやすくなります。
    3. 設定を反映:bashsudo update-initramfs -u

    3. マウントポイントのパーミッション確認

    念のため、マウント先が原因でないか確認します。

    bash

    sudo chown $USER:$USER /mnt/nas10tb
    

    これで解決しない場合:
    起動直後に mount コマンドを叩かずに、以下のコマンドの結果を見てください。

    • systemctl status mnt-nas10tb.mount

    ここで「Time out」が出ているか、別のエラーが出ているかで最後の一手が決まります。まずは fstab の 0 1 を 0 0 に変えること を優先して試してみてください。

    再起動後、自動でマウントされているか、または状況に変化はありましたか?

    ● mnt-nas10tb.mount – /mnt/nas10tb Loaded: loaded (/etc/fstab; generated) Active: active (mounted) since Sat 2026-02-21 18:33:12 JST; 1min 36s ago Where: /mnt/nas10tb What: /dev/md0 Docs: man:fstab(5) man:systemd-fstab-generator(8) Tasks: 0 (limit: 28608) Memory: 6.7M (peak: 7.2M) CPU: 66ms CGroup: /system.slice/mnt-nas10tb.mountFeb 21 18:33:12 ubuntu-nas systemd[1]: Mounting mnt-nas10tb.mount – /mnt/nas10tb…Feb 21 18:33:12 ubuntu-nas systemd[1]: Mounted mnt-nas10tb.mount – /mnt/nas10tb.マウントされました。

    ついにマウントされましたね!良かったです。

    結果を見る限り、今回の原因は「UUIDの解決タイミング」「起動時のディスクチェック(fsck)」の合わせ技だった可能性が高いです。

    大容量(10TB)のRAIDアレイの場合、起動時にOSが「このUUIDはどこだ?」と探している間にタイムアウトしたり、バックグラウンドでfsckが走ってマウントをブロックしたりすることがよくあります。

    今回の設定のポイントをまとめておきます:

    • /dev/md0 直指定: UUIDの解決を待たずにデバイスに直結。
    • 末尾 0 0: 巨大なアレイの起動時チェックをスキップして即マウント。
    • タイムアウト延長: ストレージの回転やRAIDの組み立て時間を確保。

    このまま運用して問題ありませんが、ディスクチェックをスキップする設定にしたので、数ヶ月に一度は手動でファイルシステムの整合性チェック(fsck)や、RAIDの不一致チェック(scrubbing)を行うことをおすすめします。

    RAIDの健康状態チェック(たまに実行すると安心です):

    bash

    # RAIDの不一致チェックを開始
    echo check | sudo tee /sys/block/md0/md/sync_action
    

    快適なNASライフを!他にお困りのことがあればいつでも聞いてください。

    zshでwhich rsyncとしたら、rsync: aliased to noglob rsyncと出ました。rsyncのフルパスを知りたいのですが、どこなんでしょう。

    zshでwhich rsyncとしたら、rsync: aliased to noglob rsyncと出ました。rsyncのフルパスを知りたいのですが、どこなんでしょう。

    エイリアスが設定されていると、通常のwhichではそのエイリアスの内容が表示されてしまいますね。

    rsyncの実行ファイルのフルパスを確認するには、以下のいずれかのコマンドを試してみてください。

    1. where コマンドを使う (zshの組み込みコマンド)

    zshではwhereを使うと、エイリアス、関数、そして実行ファイルのパスをすべて列挙してくれます。

    zsh

    where rsync
    

    2. command を頭につける

    エイリアスを無視してコマンドを探すよう指示できます。

    zsh

    which -a rsync
    # または
    command -v rsync
    

    3. バックスラッシュを頭につける

    一時的にエイリアスを無効化して場所を特定します。

    zsh

    which \rsync
    

    おそらく /usr/bin/rsync や(Homebrewを入れている場合は) /opt/homebrew/bin/rsync などが表示されるはずです。

    ちなみに、その noglob というエイリアスは、リモートパスを指定する際の [ や * などの記号をzshが勝手に展開してエラーになるのを防ぐために設定されている便利なものですよ。

    パスは無事に見つかりそうですか?もし特定のバージョンのrsyncを探しているなら、その旨教えてください!

    crontabでrsyncを使いたいのですが、フルパスじゃ無いとダメですよね。

    はい、基本的には

    フルパスで記述するのが確実です。

    cronは、あなたが普段使っているシェル(zshなど)とは異なり、非常に限られた環境変数(PATH)しか持っていません。そのため、エイリアスも効きませんし、rsync という名前だけではコマンドを見つけられず、実行に失敗することがよくあります。 

    rsyncのパスを確認して設定する方法

    1. パスを確認する
      ターミナルで以下のコマンドを打ち、表示されたパス(例: /usr/bin/rsync)をコピーしてください。
      zsh
      command -v rsync
    2. crontabに記述する
      crontab (crontab -e) には、確認したフルパスを使って記述します。
      cron
      # 例:毎日深夜3時に実行する場合 0 3 * * * /usr/bin/rsync -av /src/dir /dest/dir

    補足:エイリアス(noglob)について

    あなたのzshで表示された noglob は「ワイルドカード(*など)をシェルに展開させない」ための設定ですが、cronはそもそも別のシェル(通常は /bin/sh)で動くため、このエイリアスは引き継がれません。cronでワイルドカードを使いたい場合は、そのまま記述して問題ありません。

    もしパスを指定しても動かない場合は、crontabの冒頭に PATH を定義するという解決策もあります。

    設定しようとしているバックアップ先は、同じPC内(ローカル)ですか?それともリモートサーバーですか?

    リモートサーバーですね。

    17 hours ago

    リモートサーバーへのバックアップをcrontabで自動化する場合、「パスの指定」に加えて「認証の自動化」が非常に重要になります。

    cronはパスワード入力を待つことができないため、手動で実行するときのようにパスワードを打つことができません。以下の3つのポイントを押さえて設定してください。

    1. rsyncコマンドをフルパスで書く 先ほど確認した通り、/usr/bin/rsync などのフルパスを使用します。 

    2. SSH鍵認証(パスワードレス)を設定する 

    パスワードなしでログインできるように、SSH公開鍵認証を設定しておく必要があります。 

    • 鍵の作成ssh-keygen -t ed25519(パスフレーズは空にする)
    • 鍵の転送ssh-copy-id ユーザ名@リモートサーバー
    • 確認ssh ユーザ名@リモートサーバー でパスワードなしでログインできればOKです。 

    3. crontabの記述例

    秘密鍵の場所を明示的に指定(-e "ssh -i /path/to/key")しておくと、cron環境でも確実に動作します。 

    cron

    # 毎日午前2時にリモートサーバーへバックアップ
    0 2 * * * /usr/bin/rsync -avz -e "ssh -i /home/yourname/.ssh/id_ed25519" /local/dir/ ユーザ名@リモートサーバー:/remote/dir/
    

    💡 運用上の注意点

    • noglobの代わり: cronでワイルドカード(*など)を使いたい場合は、そのまま書いて大丈夫です(zshのエイリアスを気にする必要はありません)。
    • ログの保存: 何かあったときに原因がわかるよう、ログを出力させるのがおすすめです。
      • 末尾に >> /home/yourname/rsync.log 2>&1 を足すと、実行結果がファイルに記録されます。 

    すでにSSHの公開鍵認証でのログインは設定済みでしょうか?それともこれから設定されますか?

    公開鍵は作成済みで設定済みです。

    公開鍵認証の設定済みとのことですので、あとは 

    crontab特有の環境 に合わせた記述をするだけです。

    以下の点に注意して設定を完成させてください。

    1. 秘密鍵のパスを明示する

    cron環境では普段のSSH設定(~/.ssh/configなど)を読み込まない場合があるため、-e オプションで秘密鍵を指定するのが最も確実です。 

    2. crontabへの記述例

    ターミナルで crontab -e を実行し、以下のような形式で記述します。

    cron

    # 毎日午前3時に実行(パスはご自身の環境に合わせて適宜書き換えてください)
    0 3 * * * /usr/bin/rsync -avz -e "/usr/bin/ssh -i /home/yourname/.ssh/id_ed25519" /local/dir/ user@remote-host:/remote/dir/
    
    • /usr/bin/rsync: 先ほど確認したフルパスを使います。
    • -e "/usr/bin/ssh -i ...": SSHコマンドもフルパスで書き、秘密鍵の場所を指定します。
    • 末尾の /: 送信元ディレクトリの末尾に / をつけると「中身だけ」を、つけないと「ディレクトリごと」コピーします。 

    3. ログを出力して確認する

    cronはエラーが起きても画面に表示されないため、ログファイルに書き出す設定を強く推奨します。

    cron

    0 3 * * * (上記コマンド) >> /home/yourname/rsync.log 2>&1
    

    💡 最後のチェックポイント

    cronで実行する前に、一度ターミナルから「フルパスを使った状態」でコマンドを叩いてみてください。 そこでパスワードを聞かれずに同期が完了すれば、crontabでもそのまま動くはずです。

    もし実行時に「Host key verification failed」というエラーが出る場合は、一度手動でSSH接続して Known Hosts に登録する必要がありますが、そのあたりは大丈夫そうですか?

    OKです。

    バッチリですね!これで自動バックアップの準備は万端です。

    もし実際に動かしてみて「なぜか同期されない」「ログにエラーが出る」といったことがあれば、ディレクトリの権限設定や、リモート側のrsyncパスが原因のこともありますので、いつでも相談してください。

    念のため、実行時間を1分後くらいに設定したテスト用の1行をcrontabに書き込んで、実際に動くか最終確認してみるのがおすすめですよ!

    今回はバックアップのログも保存するように設定しますか?

    初回のバックアップになるので、ログは見たいですね。

    初回のバックアップは転送量も多く、予期せぬエラーが出る可能性も高いため、詳細なログを残すのが正解です。

    通常の -avz に、詳細を表示する -v をもう一つ重ねたり、進捗を表示するオプションを組み合わせると状況が把握しやすくなります。

    ログ出力付きの crontab 記述例

    以下の内容を crontab -e に記述してください。

    cron

    # 毎日午前3時に実行し、ログを日付付きで保存
    0 3 * * * /usr/bin/rsync -avvz -e "/usr/bin/ssh -i /home/yourname/.ssh/id_ed25519" /local/dir/ user@remote-host:/remote/dir/ >> /home/yourname/rsync_$(date +\%Y\%m\%d).log 2>&1
    

    コードは注意してご使用ください。

    ログを詳細かつ見やすくするためのポイント

    1. 詳細モード (-vv)-v を2つ重ねることで、どのファイルがスキップされたか、なぜ転送されたかなどの詳細が出力されます。
    2. 日付付きファイル名 ($(date +\%Y\%m\%d)): 毎日ログファイルが分かれるので、後から確認しやすくなります。
      • ※ crontab内では % は特別な意味を持つため、\% とエスケープする必要があります。
    3. 標準エラー出力の統合 (2>&1): これを書くことで、正常なログだけでなく「エラーメッセージ」も同じファイルに書き込まれます。

    実行後の確認方法

    バックアップが開始されたら、別のターミナルで以下のコマンドを打つと、リアルタイムで転送状況を確認できます。

    zsh

    tail -f /home/yourname/rsync_202XMMDD.log
    

    コードは注意してご使用ください。

    初回はデータ量が多いと思いますが、無事に完走することを祈っています!
    転送するファイルの総量(GB単位など)はかなり大きいのでしょうか?

    Macosのzshで、フォルダを圧縮したい。中にはjpgファイルが入っているのだけど、フォルダが階層になっている部分がある。圧縮するのはjpgファイルが入っているフォルだけ。できるかな。

    Macosのzshで、フォルダを圧縮したい。中にはjpgファイルが入っているのだけど、フォルダが階層になっている部分がある。圧縮するのはjpgファイルが入っているフォルだけ。できるかな。

    February 19, 2026

    MacOSのzshを使用して、

    JPGファイルが含まれているフォルダのみを個別に(または再帰的に)圧縮することは可能です。

    フォルダ階層を維持したまま、特定の条件(JPGの有無)でフィルタリングして圧縮する方法をいくつか紹介します。

    1. JPGが含まれる各フォルダを個別にZIPにする

    JPGファイルが直接入っているフォルダを特定し、そのフォルダごとにZIPファイルを作成するコマンドです。

    zsh

    
    
    for dir in **/*(/); do
      if [[ -n $(ls "$dir"/*.jpg 2>/dev/null) ]]; then
        zip -r "${dir%/}.zip" "$dir"
      fi
    done
    • **/*(/):現在のディレクトリ以下のすべてのディレクトリを再帰的に探します。
    • ls "$dir"/*.jpg:各ディレクトリ内にJPGがあるかチェックします。
    • zip -r "${dir%/}.zip" "$dir":見つかった場合、そのフォルダ名でZIPを作成します。 

    2.JPGファイルのみを抽出して一つのZIPにまとめる(階層維持)

    特定のJPGファイルだけを抜き出し、元の階層構造を保ったまま一つのZIPにまとめたい場合は、findコマンドと組み合わせるのが確実です。

    zsh

    find . -name "*.jpg" | zip -@ result.zip
    
    • find . -name "*.jpg":JPGファイルだけを再帰的に探し出します。
    • zip -@ result.zip:渡されたファイルリストを受け取り、階層を維持したまま result.zip に圧縮します。 

    3. Mac特有の不要ファイルを除外する

    MacでZIPを作成すると、Windows等で展開した際に __MACOSX や .DS_Store といった不要なファイルが混入することがあります。これらを除外して圧縮するには -x オプションを追加してください。 

    zsh

    zip -r output.zip target_folder -x "*.DS_Store" -x "__MACOSX/*"
    

    実行前の注意点

    • テスト実行: 大事なファイルを操作する前に、コピーしたフォルダなどで動作を確認することをおすすめします。
    • 大文字・小文字.jpg と .JPG が混在している場合は、-name "*.[jJ][pP][gG]" のように指定すると両方にヒットします。

    作成したZIPファイルをどこに保存したいか(各フォルダ内か、デスクトップかなど)によって最適なコマンドが変わりますが、まずは1つ目の方法がご希望に近いかと思います。

    うまくいっています(今テスト中)。ただ、AppleDoubleファイル(._)

    February 19, 2026

    うまくいっているようで良かったです!

    Mac特有のAppleDoubleファイル(._から始まる隠しファイル)は、外部とのやり取りで邪魔になることが多いですよね。

    それらを除外して圧縮するには、zipコマンドに -x オプションを追加して、明示的に「ドットから始まり、アンダースコアが続くファイル」を無視するように指定します。

    先ほどの1番のスクリプトを改良すると、以下のようになります:

    zsh

    for dir in **/*(/); do
      if [[ -n $(ls "$dir"/*.jpg 2>/dev/null) ]]; then
        # -x オプションで ._ ファイルと .DS_Store を除外
        zip -r "${dir%/}.zip" "$dir" -x "*/.*"
      fi
    done
    

    ポイント

    • -x "*/.*": これを指定することで、フォルダ内の ._filename や .DS_Store といった隠しファイルを一括で除外できます。
    • もしすでに環境変数で COPYFILE_DISABLE=1 が設定されていれば作成されにくいのですが、コマンド側で制御するのが最も確実です。

    さらに徹底して除外したい場合は、圧縮コマンドの前に一時的にメタファイルを生成しない設定を加えることもできます:

    zsh

    export COPYFILE_DISABLE=1
    # この後に zip コマンドを実行
    

    テスト中のフォルダで、生成されたZIPの中に ._ ファイルが含まれていないか、unzip -l ファイル名.zip で中身をリスト表示して確認してみてください。

    このまま全てのフォルダを一括で処理する段階に進んでも大丈夫そうですか?

    大丈夫そうです。ありがとうございました。

    February 19, 2026

    よかったです!テストも無事に終わったようで安心しました。

    最後に一点だけ補足ですが、もし大量のフォルダを処理した後に、作成されたZIPファイルが正しいか不安になった場合は、以下のコマンドでZIPファイルの中身(ファイル名)を一覧表示してサクッと確認できます。

    zsh

    unzip -l 作成したファイル名.zip
    

    これで ._ ファイルが消えていれば完璧です。

    それでは、一括処理頑張ってください!また何かあればいつでも聞いてくださいね。

    JPG以外のファイル形式(pngやheicなど)も対象に含めたくなった場合は、またお知らせください。

    jpgとjpegが混在しているファイルがありました。

    35 minutes ago

    jpg と jpeg、さらに大文字の JPG などが混在していても、一括で判定できるようにスクリプトを少し拡張しましょう。 

    zshの「ワイルドカード(グロブ)」という機能を使うと、複数の拡張子をまとめて指定できます。

    修正版スクリプト

    以下のコマンドは、jpgjpeg、さらにそれらの大文字(JPGJPEG)のいずれかが含まれるフォルダを対象にします。

    zsh

    for dir in **/*(/); do
      # jpg または jpeg (大文字小文字を問わない) があるかチェック
      if [[ -n $(ls "$dir"/*.(#i)(jpg|jpeg) 2>/dev/null) ]]; then
        zip -r "${dir%/}.zip" "$dir" -x "*/.*"
      fi
    done
    

    変更のポイント

    1. (#i): これを付けると、それ以降のパターンが大文字・小文字を区別しなくなります(jpg も JPG もヒットします)。
    2. (jpg|jpeg): 「または」を意味する書き方で、両方の拡張子をチェック対象に含めます。
    3. 事前に必要な設定: もしエラーが出る場合は、ターミナルで一度だけ setopt extended_glob を実行してください(zshの高度な検索機能を有効にします)。 

    これで、拡張子がバラバラでも「画像が入っているフォルダ」を漏れなく圧縮できるはずです。 

    もし特定のフォルダだけ除外したい、あるいは圧縮後に元のフォルダを削除したいといった追加のご要望があれば、教えてくださいね。

    テーマを変えてみた

    テーマを変えてみた

    このブログなんとも殺風景なので、ブログテーマを変えてみた。BlogghiamoというThemeで、変更箇所というとブログヘッダーに並んでいたソーシャルアイコン群を非表示にしたぐらい。あとはこのThemeにあらかじめ組み込まれていたカテゴリーを削除した。

    シンプルな見た目はそのままに少し色づいて見た目はいい感じになったと思っている。まぁ、見る人は少ないと思うけどね。

    終わった!

    終わった!

    UbuntuとOpenSUSEをまたいで続いていたServerトラブルによるData救出作戦がようやく終了。

    さて、安定版への移行へ向かわなければなりませんね。

    なんと凍瘡(しもやけ)

    先日来、右足の親指と人差し指の間に赤黒い部分ができ、触るといたいような感じがあった。そのうち水ぶくれのようなものもできはじめたので、火傷した覚えもないしなんだろうと思い、念のため皮膚科を受診した。

    診察の結果は凍瘡(しもやけ)だとのこと。別段そんな覚えがない旨話をしたら、年を取って血行が悪くなってなることがある。とのこと。「じじい」といわれた気がして落ち込んだ。

    塗り薬を処方され、塗布している。それにしても、しもやけとは思わなかった。