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内(ローカル)ですか?それともリモートサーバーですか?

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

リモートサーバーへのバックアップを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ファイルが入っているフォルダだけ。できるかな。

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ファイル(._)

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

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 で中身をリスト表示して確認してみてください。

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

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

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

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

zsh

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

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

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

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

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

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救出作戦がようやく終了。

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

なんと凍瘡(しもやけ)

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

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

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

つぎつぎにトラブルに見まわれる

つぎつぎにトラブルに見まわれる

良かれと思ってCPUを交換しようとしたらマザーボードを壊すし、用意したマザーボードはCPUと合致しないし、ハードが動いたと思ったらソフト面でトラブってろくに動かない。

そうかと思ったら別のマシンのアップデートをかけたらPOSTで止まるトラブルに見まわれるしで、踏んだり蹴ったり。

いい加減かれこれ1ヶ月はバタバタしている。

一つ片付いたらまた一つで気持ちも滅入る。どうしてくれようか。

CR1220

体温計の電池切れでボタン電池が必要になった。CR1220なんだけど、当面体温計でしか使わないので1ヶあればOK。通販で見ると5個セットとか12個セットなどセットものしかない。

どうしようかと思っていたのだけど、ググってみると100均でも販売しているらしく、行ってみたら確かにある。1ヶ100円と言うことでセットものに比べると割高になるけど問題ないと思って購入した。

100均って何でもあるんだね。感心した。

佐川急便の再配達

佐川急便の再配達

佐川急便から荷物が届くはずでした。結局届いていませんが。今日は午前中、出かけていまして1回目の配達がその時に来たようです。自宅には若干耳が遠くなった母がいたんですが、気がつかなかったそうで、それはしょうがないなと思って再配達を依頼しました。

で、午後に私も両親もいたにもかかわらず誰も気がつかないまま再び不在票が入っていました。玄関にはチャイムも設置してありますので、いないと思ったらチャイムを鳴らして欲しかったなぁ。

結局、配達には期待せず、自分で取りに行くことにしました。明日行ってきます。

休んでる

休んでる

昨日今日と具合が悪くて仕事を休んでいる。

昨日と今日の午前中はベッドの上。おかげで腰が痛い。午後からはMacの前に座っている。まぁ、たいしたことはできないけど溜めていた作業をしたりして。

ほんとどうにかならんもんだろうか。

iPhoneのバッテリー切れ

iPhoneのバッテリー切れ

今充電中だけど、朝の段階で80%あったバッテリーが帰りの車の中でバッテリー切れ。突然Bluetoothが切れて音楽が止まったので確認したら1%。

バッテリーのパフォーマンスを示す指数は93%と正常なんだけど、消費が大きいみたい。とりあえずの対策として最大充電量を80%から90%に増やしてみた。これで様子を見てみようと思うけどさて、どうなるか。